休眠返回会话中的值,但不从数据库中返回



我得到一个实体'A'

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

从数据库中。假设这个实体"A"在数据库中有一个属性"值"200。

现在,在我的 Java 代码中,我更改了此实体的属性。 比方说,我将"value"属性更改为"500",然后将其添加到某个列表中。

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

这就是所谓的"第一级缓存"吗?

您的假设(关于第一级缓存)是正确的。例如:接口会话:

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

或者在这里 第 2 章。建筑;2.1. 概述

Extract: Session (org.hibernate.Session)

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

而且,您可以看到我们可用的方法,从会话中删除对象:

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

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

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

等等。 在这种情况下,Evict应该可以正常工作。我们必须获取当前实例('A')并从会话中显式Evict它。

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

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

我建议在谷歌上搜索休眠提交、刷新和分离,并在它们写入数据库时读取。更好的是,如果你还没有这样做,我建议您阅读一本关于Hibernate的好书(amazon.com 搜索一本书的好评)以很好地掌握这项技术。

我回复这篇文章的原因不是直接回答你的问题,而是建议你编辑你的 hiberinate.cfg.xml 文件并将以下内容设置为 true: <属性名称>错误。这将导致控制台窗口显示每个发送到数据库的 sql 语句时列出。这样,您可以准确看到何时对数据库进行写入。然后,您可以尝试您研究/阅读的内容,并验证它是否按预期工作。

最新更新