我的服务层中有以下方法,
检索并返回同一实体
@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();
}
当方法执行时,DB已成功更新,但返回的实体状态不反映更新的状态值。默认情况下,不能在同一事务中进行更改吗?
答案 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