提问者:小点点

批处理更新从更新[0]中返回了意外的行数;实际行数:0;应为:1;"-使用@Scheduled方法调用删除时


我遇到了以下问题。错误“批量更新从更新 [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。现在我只处理一个上下文,这个问题已经消失了。


共1个答案

匿名用户

代码 sessionFactory.getCurrentSession().delete(order);中不需要以下语句,您正在已附加到会话的实体上执行 user.removeOrder(order);