[英]Force Hibernate query to access database
我已将实体加载到我的事务中并更改了该实体的属性。 该交易尚未提交。 现在我想获得已更改属性的原始值。
我尝试过一个HQL查询,例如select p.property from Person p where p.id = 1
, select 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.