【问题标题】:Hibernate+Spring transaction not updating properlyHibernate+Spring 事务没有正确更新
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 这不是反过来吗?刷新将数据库与会话状态同步?如果我调用 flush(),我的 1 级缓存将保持不变(即没有更新),我将需要再次调用 get() 以将其与数据库同步。
    猜你喜欢
    • 2018-06-17
    • 2018-11-11
    • 2017-03-04
    • 2012-05-06
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多