Java &引用;批更新从更新[0]返回了意外的行计数;实际行数:0;预期:1"E;”使用@Scheduled方法调用删除时
我面临着以下问题。使用@Scheduled method invocation删除对象时出现错误“批处理更新从更新[0]返回意外的行数;实际行数:0;应为:1;”。错误仅在@Scheduled invocation时出现,我第一次调用Java &引用;批更新从更新[0]返回了意外的行计数;实际行数:0;预期:1"E;”使用@Scheduled方法调用删除时,java,multithreading,spring,hibernate,Java,Multithreading,Spring,Hibernate,我面临着以下问题。使用@Scheduled method invocation删除对象时出现错误“批处理更新从更新[0]返回意外的行数;实际行数:0;应为:1;”。错误仅在@Scheduled invocation时出现,我第一次调用deleteInactiveOrders()时出错。如果从控制器手动调用调度方法-一切正常,则不会出现错误。我假设这个错误与多线程问题有关,但我不知道如何修复它 服务方式: @Transactional @Scheduled(cron = "*/30 * * * *
deleteInactiveOrders()
时出错。如果从控制器手动调用调度方法-一切正常,则不会出现错误。我假设这个错误与多线程问题有关,但我不知道如何修复它
服务方式:
@Transactional
@Scheduled(cron = "*/30 * * * * *")
public void deleteInactiveOrders() {
orderDAO.deleteInactiveOrders();
}
orderDAO.deleteInactiveOrders():
public void deleteInactiveOrders(){
List allInactiveOrdersList=sessionFactory.getCurrentSession().createQuery(“从Order,其中orderDate您的代码中不需要以下语句sessionFactory.getCurrentSession().delete(Order);
,您正在执行一个user.removeOrder(Order);
在已附加到会话的实体上,这样它将负责删除订单。好的,您正在访问列表中的订单,因此不能同时删除它。但是当删除不活动订单()
从控制器手动调用一切正常。此错误仅在调度调用时发生。user.removeOrder(order);在这里,您只需从列表中删除实体?或者执行对DB的调用?以下是代码:orders.remove(order);
-从列表中删除订单order.setUser(null);
-将用户实体变量设置为null是的,您是对的。但是删除sessionFactory.getCurrentSession().delete(order);
没有影响出错。如果我没有错,您的批处理每30秒运行一次,请验证您的进程是否在30秒内结束。否则可能是两个线程在同一个对象上运行,至少这是异常所说的。我不这么认为。我第一次调用deleteInac时出错tiveOrders()
。
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);
}
}
}
@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;
}