@Transactional 方法中所做的更改不会反映到实体中

Changes made in a @Transactional method are not reflected to the Entity

我的服务层中有以下方法,

  1. 通过 ID 检索实体
  2. 对实体执行更新
  3. 检索和returns相同的实体

    @Transactional
    @Override
    public Order acceptOrder(long orderId){
        Order Order = getOrderById(orderId);                                  // 1
        orderDao.updateOrderStatus(OrderStatus.PENDING_COMPLETION, orderId);  // 2
        return getOrderById(orderId);                                         // 3
    }   
    

    服务的方法getOrderById

    @Override
    public Order getOrderById(long id) {
        return orderDao.get(Order.class, id);
    }
    

和DAO的方法updateOrderStatus

    @Override
    public int updateOrderStatus(AppEnums.OrderStatus status, long orderId) {
        String query = "update Order set orderStatus=:status where id=:orderId";
        Query q = getHibernateSession().createQuery(query);
        q.setParameter("status", status);
        q.setParameter("orderId", orderId);
        return q.executeUpdate();
    }

当方法执行时,数据库更新成功,但返回的实体状态反映更新后的状态值。默认情况下,在同一事务中所做的更改不应该可见吗?

你可以,

更新您的实体并保存

(如评论中的 M.Deinum 所建议)

order.setOrderStatus(OrderStatus.PENDING_COMPLETION);  //2
return salesOrderDao.saveOrUpdate(order);              //3

更新后提交您的交易

@Transactional
@Override
public Order acceptOrder(long orderId){
    Order order = getOrderById(orderId);                                  // 1
    orderDao.updateOrderStatus(OrderStatus.PENDING_COMPLETION, orderId);  // 2
    //commit the transaction                                              // 3
    return getOrderById(orderId);                                         // 4
}  

注意:您将需要以某种方式访问​​交易。

从会话缓存中删除实例

您可以使用 Session.evict

orderDao.updateOrderStatus(OrderStatus.PENDING_COMPLETION, orderId);  //2
hibernateSession.evict(order);                                        //3
return getOrderById(orderId);                                         //4

注意:您将需要访问 HibernateSession

但是你可以做这个answer,

中提到的类似的事情
@Transactional
public void method1(){
    this.updateM1Service();
    this.getDataService();
}

@Transactional (propagation = Propagation.REQUIRES_NEW)
public void updateM1Service(){
    dao.updateM1();
}

@Transactional
public void getDataService(){
    dao.getData();
}