首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在@Transactional方法中所做的更改不会反映到实体

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

Stack Overflow用户
提问于 2015-12-10 19:09:11
回答 1查看 2.5K关注 0票数 1

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

  1. 按ID检索实体
  2. 执行对entity
  3. Retrieves的更新并返回相同的实体@Transactional @Override public Order acceptOrder(long orderId){ Order = getOrderById(orderId);// 1 Order orderId);// 2 return getOrderById(orderId);// 3}服务的方法getOrderById

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

和DAO的方法updateOrderStatus

代码语言:javascript
复制
    @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被成功更新,但是返回的实体的状态不是反映的是更新后的状态值。默认情况下,在同一事务中所做的更改不应该是可见的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-10 19:27:56

你可以,

更新实体并保存它

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

代码语言:javascript
复制
order.setOrderStatus(OrderStatus.PENDING_COMPLETION);  //2
return salesOrderDao.saveOrUpdate(order);              //3

在事务更新后提交事务

代码语言:javascript
复制
@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来完成此操作

代码语言:javascript
复制
orderDao.updateOrderStatus(OrderStatus.PENDING_COMPLETION, orderId);  //2
hibernateSession.evict(order);                                        //3
return getOrderById(orderId);                                         //4

注意:您需要访问HibernateSession

但是你可以做这个answer中提到的事情,

代码语言:javascript
复制
@Transactional
public void method1(){
    this.updateM1Service();
    this.getDataService();
}

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

@Transactional
public void getDataService(){
    dao.getData();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34200369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档