【发布时间】:2014-04-17 20:48:00
【问题描述】:
我对使用 Hibernate+Spring 还很陌生,但是经过一段时间的阅读文档后,我就可以毫无问题地了解它的基础知识。 我遇到了一个我找不到任何信息的问题,我认为如果我发布一个示例来理解我的意思会更容易。
所以我有这个方法来更新 UserTask 上的日期字段:
@Transactional(readOnly = false)
@Override
public Usertask startUserTask(Long usertaskID, Date start)
{
Usertask ut = getCurrentSession().get(Usertask.class, usertaskID);
String query_stm = "update " + Usertask.class.getName() + " ut set ut.userTaskActualStart = :actualstart where ut.userTaskID = :userTaskID";
Query query = getCurrentSession().createQuery(query_stm);
query.setParameter("actualstart", start);
query.setParameter("userTaskID",usertaskID);
query.executeUpdate();
ut = getCurrentSession().get(Usertask.class, usertaskID);
return ut;
}
所以首先我从数据库中获取了我的 Usertask 实体,然后一切正常。然后我使用查询仅更新数据库上的 userTaskActualStart 字段。 我期待 ut 也会更新 userTaskActualStart 字段以反映这一点,但是当您通过查询进行更新时,似乎没有更新 1 级缓存实体?
我尝试再次从数据库中读取 Usertask,我希望这次会看到 userTaskActualStart 已填充,但这也不会发生。我知道事务实际上还没有提交,因为它在一个带有 @Transactional 注释的方法中,但是使用常规 JDBC 它会以这种方式工作。
这就是 Hibernate 的工作方式吗?有没有办法让它可配置,以便在同一个事务中我实际上可以看到以前的更新? 这可能有点烦 imo,因为您最终会得到与数据库不同步的 1 级缓存实体。
如果我打电话:
utDao.startUserTask(userTaskID,new Date());
Usertask ut = utDao.get(Usertask.class, usertaskID);
然后 Usertask 实体将与 userTaskActualStart 一起正确填写,因为当然事务已经提交了。
如果我能更好地理解这些概念,我们将不胜感激。
【问题讨论】:
标签: java spring hibernate jpa transactions