我得到一个实体“ A”使用
getHibernateTemplate().get(A.class, 100)
从数据库中。假设该实体“ A”在数据库中具有属性“值” 200。
现在,在我的Java代码中,我更改了该实体的属性。可以说,我将“值”属性更改为“ 500”,然后将其添加到某些列表中。
现在,如果我再次对同一实体执行getHibernateTemplate()。get(A.class,100),则将获取更新后的实体(值500)。如何强制休眠从数据库中获取实体,而不从代码中更新实体?
这就是所谓的“一级缓存”吗?
最佳答案
您的假设(关于一级缓存)是正确的。如此处所述:Interface Session:
Java应用程序和Hibernate之间的主要运行时接口。
这是中央API类,抽象了持久性服务的概念。
或者在这里第2章。 2.1. Overview
提取:会话(org.hibernate.Session)
单线程,短暂的对象,表示应用程序与持久性存储之间的对话。它包装了JDBC
连接,是进行交易的工厂。会议举行强制性
导航时使用的持久对象的第一级缓存
对象图或按标识符查找对象。
此外,您还可以查看我们可用的方法,以从会话中删除对象:
逐出(Object object):
从会话缓存中删除该实例。
刷新(对象对象):
从底层数据库重新读取给定实例的状态。
明确():
完全清除会话。
还有很多。在这种情况下Evict
应该可以工作。我们必须采用当前实例('A'),并在会话中明确地Evict
它。
如果我们已经加载了一些/更多东西,而我们又不知道Evict()
是什么,我们只需要获取最新数据即可。然后,我们可以调用Clear()
完全重置会话并重新开始。
这有点激进,因为会话中的任何对象都不会在会话Flush()
上更新/插入...但是这可能是我们在这种情况下想要的(经常用于测试...加载,清除)。 ..更改并刷新)