我遇到了关于从关联中删除子对象的奇怪问题。
这是我的第一个对象Order:
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "order", orphanRemoval=true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
private List<ExchangeTransaction> exchangeTransactions = new ArrayList<ExchangeTransaction>();
这是我的第二个对象ExchangeTransaction:
@ManyToOne
@JoinColumn(name = "orderId", insertable = true, updatable = false)
private Order order;
我想删除带有所有相关 ExchangeTransactions 的订单。
如果我通过控制器执行删除操作,一切正常。这是控制器内部的代码:
Order order = orderService.getOrder(orderId);
User user = order.getUser();
user.removeOrder(order);
orderService.removeOrder(order);
如果@Scheduled 服务执行删除操作,我会收到错误消息:
错误 [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler] [] pool-3-thread-1 计划任务中发生意外错误。org.springframework.dao.InvalidDataAccessApiUsageException:已删除的对象将被级联重新保存(从关联中删除已删除的对象):[currencyexchange.model.ExchangeTransaction#2];
服务对象内的代码:
@Override
@Transactional
@Scheduled(cron = "*/30 * * * * *")
public void deleteInactiveOrders() {
orderDAO.deleteInactiveOrders();
}
DAO 内的代码:
@Override
public void deleteInactiveOrders() {
List<Order> allInactiveOrdersList = sessionFactory.getCurrentSession().createQuery("from Order where orderDate <= sysdate-1").list();
if (allInactiveOrdersList.size() >=1 ){
for (Order order: allInactiveOrdersList){
User user = order.getUser();
user.removeOrder(order);
sessionFactory.getCurrentSession().delete(order);
}
}
}
更新:这不是@Scheduled 问题。当我从控制器调用 deleteInactiveOrders() 时,我遇到了同样的错误。