Hibernate + Spring事务没有正确更新

时间:2014-04-17 20:48:01

标签: java spring hibernate jpa transactions

我使用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的工作方式吗?有没有办法让它可配置,以便在同一个事务中我可以实际看到以前的更新? 这可能有点烦人,因为你最终会得到与数据库不同步的1级缓存实体。

如果我打电话:

utDao.startUserTask(userTaskID,new Date());
Usertask ut = utDao.get(Usertask.class, usertaskID);

然后,Usertask实体将自动填充userTaskActualStart,因为事务已经提交了。

任何帮助我都可以理解这些概念,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

发生刷新时,您的1级缓存仅与数据库同步。您可以配置何时发生这种情况。看看这个:

http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html