@Transactional 方法中所做的更改不会反映到实体中
Changes made in a @Transactional method are not reflected to the Entity
我的服务层中有以下方法,
- 通过 ID 检索实体
- 对实体执行更新
检索和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();
}
我的服务层中有以下方法,
- 通过 ID 检索实体
- 对实体执行更新
检索和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();
}