代码之家  ›  专栏  ›  技术社区  ›  tobiasbayer

强制Hibernate查询访问数据库

  •  10
  • tobiasbayer  · 技术社区  · 14 年前

    我已将一个实体加载到事务中,并更改了该实体的属性。交易尚未提交。现在我想得到更改后的属性的原始值。

    select p.property from Person p where p.id = 1 具有事务中加载的实体的ID。

    我已经准备好了 query.setHint("org.hibernate.cacheMode", CacheMode.IGNORE); 在执行查询之前。但没有成功。Hibernate返回当前事务中设置的值,而不是数据库中的值。

    有什么办法吗?

    4 回复  |  直到 14 年前
        1
  •  11
  •   Pascal Thivent    14 年前

    我已将一个实体加载到事务中,并更改了该实体的属性。交易尚未提交。现在我想得到更改后的属性的原始值。

    简而言之:自己追踪旧的价值观。

    我试过使用HQL查询,比如select p.property from Person p,其中p.id=1,其中包含事务中加载的实体的id。

    我已经准备好了查询.setHint("org.hibernate.cacheMode", 缓存模式。忽略);执行查询之前。

    此提示用于影响 查询缓存 (依赖于二级缓存),这不会影响您当前的“问题”。

    或者

    • session.refresh() 强制重新加载您的实体(这样您将丢失更改)
    • 存储前面提到的值。
        2
  •  6
  •   andrefaria    12 年前

    这次会议对我很有效。

    StatelessSession statelessSession = sessionFactory.openStatelessSession();
    try {
        return statelessSession.get(Ticket.class, ticketKey, LockMode.READ)
    } finally {
       statelessSession.close()
    } 
    
        3
  •  2
  •   Sebastian    14 年前

    这可能有助于:

    如果要强制查询缓存 (忽略它找到的任何缓存结果 那里)你可以使用 org.hibernate.Query查询.设置缓存模式(缓存模式.刷新) . 与您所在的地区 休眠将有选择地强制 结果缓存在那个特定的 特别适用于 基础数据可能已更新 更有效的批量替代方案 org.hibernate.SessionFactory.execit查询()。

    (来自 http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html

    但是,它是否打算在其他进程更新数据库时使用,应小心使用。 你的情况不同。由于此方法发生在任何事务之外,您应该确保它不会与您的设计冲突。也许你可以重构你的调用流来避免这种行为,从另一个源或者在修改缓存之前检索这个字段。。。

        4
  •  1
  •   james    14 年前

    唯一的方法是在当前事务之外运行查询。