1

我遇到了关于从关联中删除子对象的奇怪问题。

这是我的第一个对象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() 时,我遇到了同样的错误。

4

0 回答 0