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

时间:2015-12-10 11:09:11

标签: java spring hibernate spring-transactions

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

  1. 按ID
  2. 检索实体
  3. 执行实体更新
  4. 检索并返回同一实体

    @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);
    }
    
  5. 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();
        }
    

    当方法执行时,DB已成功更新,但返回的实体状态反映更新的状态值。默认情况下,不能在同一事务中进行更改吗?

1 个答案:

答案 0 :(得分:0)

你可以,

更新您的实体并保存

(正如M.Deinum在评论中所建议的那样)

@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
}  

在您的交易更新后提交

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

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

从会话缓存中删除实例

您可以使用Session.evict

执行此操作
@Transactional
public void method1(){
    this.updateM1Service();
    this.getDataService();
}

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

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

注意:您需要访问HibernateSession

但你可以做这个answer

中提到的这样的事情
0