Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制Hibernate查询访问数据库_Java_Hibernate_Orm_Hql - Fatal编程技术网

Java 强制Hibernate查询访问数据库

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返回当前事务中设置的值,而不是数据库中的值 有什么办法可以解决这个问题吗?这可能会有帮助: 如果要强制执行查询缓存 刷新其某个区

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

我尝试过HQL查询,比如
从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两次抱怨同一实体在会话中的问题吗?听起来您可能想重新审视实现。