我得到一个实体“ 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()上更新/插入...但是这可能是我们在这种情况下想要的(经常用于测试...加载,清除)。 ..更改并刷新)

09-04 03:38
查看更多