【问题标题】:Force Hibernate query to access database强制休眠查询访问数据库
【发布时间】:2011-04-11 16:17:21
【问题描述】:

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

我已尝试使用像 select p.property from Person p where p.id = 1 这样的 HQL 查询,其中包含事务中加载的实体 ID。

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

有没有办法解决这个问题?

【问题讨论】:

  • 你不会遇到 Hibernate 抱怨同一个实体在会话中两次的问题吗?听起来您可能想重新审视实现。

标签: java hibernate orm hql


【解决方案1】:

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

简而言之:自己跟踪旧值。

我尝试过使用 HQL 查询,例如 select p.property from Person p where p.id = 1 以及事务中加载的实体的 ID。

Hibernate 将实体的唯一版本加载到给定数据库标识符的会话(第一级缓存)中。这行不通。

我设置了 query.setHint("org.hibernate.cacheMode", CacheMode.IGNORE);在执行查询之前。

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

有没有办法解决这个问题?

要么

  • 使用session.refresh() 强制重新加载您的实体(您将失去更改)
  • 存储最初提到的先前值。
  • 调用在另一个事务中执行查询的服务。

【讨论】:

    【解决方案2】:

    StatelessSession 对我有用。

    StatelessSession statelessSession = sessionFactory.openStatelessSession();
    try {
        return statelessSession.get(Ticket.class, ticketKey, LockMode.READ)
    } finally {
       statelessSession.close()
    } 
    

    【讨论】:

      【解决方案3】:

      这可能会有所帮助:

      如果你想强制查询缓存 刷新其区域之一 (忽略它找到的任何缓存结果 那里)你可以使用 org.hibernate.Query.setCacheMode(CacheMode.REFRESH)。 结合您所在的地区 已为给定查询定义, Hibernate 将选择性地强制 结果缓存在那个特定的 要刷新的区域。这是 在以下情况下特别有用 基础数据可能已更新 通过一个单独的过程,是一个很远 比散装更有效的替代品 通过驱逐该地区 org.hibernate.SessionFactory.evictQueries().

      (来自http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html,第 20.4.2 节)。

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

      【讨论】:

      • 查看我的回答我发现它并不能完全解决您的问题。即使您完全禁用二级缓存,您的实体数据也可能会进入一级缓存(会话)。为此,您应该刷新或驱逐对象......但是您应该重新输入要保存在事务提交中的字段。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2013-11-07
        • 2014-08-08
        • 2010-12-06
        相关资源
        最近更新 更多