2

I get an entity 'A' using

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

from the database. Lets say this entity 'A' has a property 'value' 200 in the database.

Now, in my Java code, I change a property for this entity. lets say, I change the 'value' property to '500' and then add it to some list.

Now, If I again do getHibernateTemplate().get(A.class, 100) for the same Entity, I am getting the updated entity(that has a value of 500). How do I force hibernate to get me the entity from the database, but not the one updated in my code?

Is this what is called as 'First Level Caching'?

4

2 回答 2

3

您的假设(关于一级缓存)是正确的。如这里所述:接口会话

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

或者在这里第 2 章。架构;2.1。概述

提取:会话(org.hibernate.Session)

一个单线程的、短暂的对象,表示应用程序和持久存储之间的对话。它包装了一个 JDBC 连接,是一个 Transaction 工厂。Session 持有持久对象的强制性第一级缓存,在导航对象图或按标识符查找对象时使用这些缓存。

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

  • evict(Object object):从会话缓存中删除此实例。

  • refresh(Object object):从底层数据库重新读取给定实例的状态。

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

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

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

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

于 2013-11-09T04:51:48.187 回答
0

我建议在 Google 中搜索休眠提交、刷新和分离,并在它们写入数据库时​​继续阅读。更好的是,如果您还没有读过一本关于 Hibernate 的好书(搜索 amazon.com 以获得对一本书的好评),我建议您阅读一本关于 Hibernate 的好书,以更好地掌握这项技术。

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

于 2013-11-08T20:36:57.543 回答