Java 强制Hibernate查询访问数据库
我已将一个实体加载到我的事务中,并已更改该实体的属性。交易尚未提交。现在我想得到更改属性的原始值 我尝试过HQL查询,比如Java 强制Hibernate查询访问数据库,java,hibernate,orm,hql,Java,Hibernate,Orm,Hql,我已将一个实体加载到我的事务中,并已更改该实体的属性。交易尚未提交。现在我想得到更改属性的原始值 我尝试过HQL查询,比如从Person p中选择p.property,其中p.id=1,并在事务中加载实体的id 我已经设置了query.setHint(“org.hibernate.cacheMode”,cacheMode.IGNORE)。但是没有成功。Hibernate返回当前事务中设置的值,而不是数据库中的值 有什么办法可以解决这个问题吗?这可能会有帮助: 如果要强制执行查询缓存 刷新其某个区
从Person p中选择p.property,其中p.id=1
,并在事务中加载实体的id
我已经设置了query.setHint(“org.hibernate.cacheMode”,cacheMode.IGNORE)在执行查询之前执行代码>。但是没有成功。Hibernate返回当前事务中设置的值,而不是数据库中的值
有什么办法可以解决这个问题吗?这可能会有帮助:
如果要强制执行查询缓存
刷新其某个区域
(忽略它找到的任何缓存结果
那里)你可以使用
org.hibernate.Query.setCacheMode(CacheMode.REFRESH)。
与您所在的地区
已为给定查询定义,
Hibernate将有选择地强制
缓存在该特定位置的结果
要刷新的区域。这是
在以下情况下特别有用:
基础数据可能已更新
通过一个单独的过程,这是一个遥远的过程
更有效的散装替代品
通过
org.hibernate.SessionFactory.executeQueries()。
(摘自第20.4.2节)
但是,它是否打算在其他进程更新数据库时使用,并且应小心使用。
你的情况不同。由于此方法发生在任何事务之外,您应该确保它不会与您的设计冲突。也许您可以重构调用流以避免这种行为,并从另一个源或在缓存中进行修改之前检索字段…唯一的方法是在当前事务之外运行查询
我已将一个实体加载到我的事务中,并已更改该实体的属性。交易尚未提交。现在我想得到更改属性的原始值
简而言之:自己追踪旧的价值观
我尝试过使用HQL查询,比如从Person p选择p.property,其中p.id=1,事务中加载的实体id
Hibernate将实体的唯一版本加载到给定数据库标识符的会话(第一级缓存)中。这行不通
我已经设置了query.setHint(“org.hibernate.cacheMode”,cacheMode.IGNORE);在执行查询之前
此提示用于影响查询缓存(依赖于二级缓存),这不会影响您当前的“问题”
这有什么办法吗
或者
- 使用
session.refresh()
- 存储前面提到的值李>
- 调用在另一事务中执行查询的服务
无状态会话对我有效
StatelessSession statelessSession = sessionFactory.openStatelessSession();
try {
return statelessSession.get(Ticket.class, ticketKey, LockMode.READ)
} finally {
statelessSession.close()
}
回顾我的答案,我发现它并没有完全解决你的问题。即使完全禁用二级缓存,您的实体数据也可能会进入一级缓存(会话)。为此,您应该刷新或逐出对象。。。但是,您应该重新输入要保存在事务提交中的字段。难道不会出现Hibernate两次抱怨同一实体在会话中的问题吗?听起来您可能想重新审视实现。