Hibernate 返回会话中的值,而不是从数据库中返回值

2024-01-02

我得到一个实体“A”使用

getHibernateTemplate().get(A.class, 100) 

从数据库中。假设该实体“A”在数据库中具有属性“值”200。

现在,在我的 Java 代码中,我更改了该实体的属性。可以说,我将“value”属性更改为“500”,然后将其添加到某个列表中。

现在,如果我再次对同一个实体执行 getHibernateTemplate().get(A.class, 100) 操作,我将获得更新后的实体(值为 500)。如何强制 hibernate 从数据库中获取实体,而不是代码中更新的实体?

这就是所谓的“一级缓存”吗?


你的假设(关于一级缓存)是正确的。例如这里所说的:接口会话 http://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/Session.html:

Java 应用程序和 Hibernate 之间的主要运行时接口。 这是抽象持久性服务概念的核心 API 类。

或者这里第 2 章:架构;2.1.概述 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/architecture.html

摘录:会话(org.hibernate.Session)

表示应用程序和持久存储之间的对话的单线程、短期对象。它包装了一个 JDBC 连接,是事务的工厂。会议召开强制性 导航时使用的持久对象的一级缓存 对象图或通过标识符查找对象。

此外,您还可以看到我们可以使用的方法来从会话中删除对象:

  • 驱逐(对象对象): 从会话缓存中删除该实例。

  • 刷新(对象对象): 从底层数据库重新读取给定实例的状态。

  • 清除(): 完全清除会话。

还有很多。Evict在这种情况下应该可以工作。我们必须获取当前实例('A')并显式地Evict来自会话。

如果我们已经加载了一些/更多的东西,并且我们不知道该做什么Evict(),我们只需要获取最新数据。然后我们可以调用Clear()完全重置会话并重新开始。

这有点激进,因为会话中的任何对象都不会在会话上更新/插入Flush()...但这可能是我们在这种情况下想要的(经常用于测试...加载、清除...更改和刷新)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate 返回会话中的值,而不是从数据库中返回值 的相关文章

随机推荐