我得到一个实体'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 语句时列出。这样,您可以准确看到何时对数据库进行写入。然后,您可以尝试您研究/阅读的内容,并验证它是否按预期工作。属性名称>