我遇到了以下问题。错误“批量更新从更新 [0] 返回意外的行计数;实际行数:0;预期:1;“ 在使用方法调用删除对象时出现@Scheduled。错误仅在@Scheduled调用时出现,我在第一次调用 deleteInactiveOrders()
时出现错误。如果从控制器手动调用计划方法 - 一切正常,则不会出现错误。我假设该错误与多线程问题有关,但我无法弄清楚如何解决它。
服务方式:
@Transactional
@Scheduled(cron = "*/30 * * * * *")
public void deleteInactiveOrders() {
orderDAO.deleteInactiveOrders();
}
orderDAO.deleteNaactiveOrders():
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);
}
}
}
错误:
调试[org.hibernate.SQL][]pool-2-thread-1从订单中删除orderId=?调试[org.hibernate.SQL][]pool-3-thread-1从订单中删除orderId=?调试[org.hibernate.SQL][]pool-3-thread-1从订单中删除orderId=?信息[org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl][]pool-2-thread-1 HHH000010:批处理发布时,它仍然包含jdbc语句ERROR[org.springframework.schedung.support.TaskUtils$LoggingErrorHandler][]pool-2-thread-1计划任务中发生意外错误。org.springframework.org.hibernate4.Hibernate OptimisticLockingFailureException:批更新从更新[0]返回了意外的行计数;实际行数:0;应为:1;嵌套异常为org.hibernate.StaleStateException:批更新从更新[0]返回了意外的行计数;实际行数:0;应为:1
实体:
@Entity
@Table(name = "orders")
public class Order implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int orderId;
.....
@ManyToOne
@JoinColumn(name = "userId", insertable = true, updatable = false)
private User user;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "order", orphanRemoval=true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
private List<ExchangeTransaction> exchangeTransactions = new ArrayList<ExchangeTransaction>();
public int getId() {
return orderId;
}
更新:我已经找到了这个问题的解决方案。问题在于这两个上下文以及它们之间的依赖关系,我的意思是ContextLoaderListener和DispatcherServlet。现在我只处理一个上下文,这个问题已经消失了。
代码 sessionFactory.getCurrentSession
().delete(order);中不需要以下语句,您正在已附加到会话的实体上执行 user.removeOrder(order);