繁体   English   中英

强制Hibernate查询访问数据库

[英]Force Hibernate query to access database

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

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

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

有没有办法解决?

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

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

我尝试过一个HQL查询,例如从Person p中选择p.property,其中p.id = 1,其中包含事务中加载的实体的ID。

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

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

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

有没有办法解决?

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

StatelessSession为我工作。

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

这可能有所帮助:

如果要强制查询缓存刷新其中一个区域(忽略它在那里找到的任何缓存结果),可以使用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节)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM