関連から子オブジェクトを削除するという奇妙な問題に直面しました。
ここに私の最初のオブジェクトOrderがあります:
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "order", orphanRemoval=true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
private List<ExchangeTransaction> exchangeTransactions = new ArrayList<ExchangeTransaction>();
これが私の2番目のオブジェクトExchangeTransactionです:
@ManyToOne
@JoinColumn(name = "orderId", insertable = true, updatable = false)
private Order order;
関連するすべての ExchangeTransactions を含む Order を削除したいと考えています。
コントローラーを介して削除操作を実行すると、すべて正常に動作します。コントローラー内のコードは次のとおりです。
Order order = orderService.getOrder(orderId);
User user = order.getUser();
user.removeOrder(order);
orderService.removeOrder(order);
@Scheduled サービスによって削除操作が実行されると、次のエラー メッセージが表示されます。
ERROR [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() を呼び出すと、同じエラーが発生します。