gpt4 book ai didi

java - @Transactional 方法中所做的更改不会反射(reflect)到实体

转载 作者:太空宇宙 更新时间:2023-11-04 13:08:25 24 4
gpt4 key购买 nike

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

  1. 通过 ID 检索实体
  2. 对实体执行更新
  3. 检索并返回相同的实体

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

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

最佳答案

你可以,

更新您的实体并保存

(正如 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 缓存中删除实例

您可以使用 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();
}

关于java - @Transactional 方法中所做的更改不会反射(reflect)到实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34200369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com