休眠二级缓存-同一实体的多个对象

时间:2019-12-02 11:10:07

标签: java database hibernate caching

我需要确保仅创建同一实体的一个对象(就像使用第一级休眠缓存加载数据以简化实体刷新时所做的那样),并且我想使用第二级缓存。

我正在测试ehcache,但无法使其正常运行。通常,我的应用程序中的实体会嵌套在其他实体中,但这只是用法的一个简单示例:

a)使用一级缓存的示例可以正常工作:

 session = HibernateUtil.getSessionFactory().openSession();
 transaction = session.getTransaction();
 transaction.begin();
 Person person=session.get(Person.class, 1L);
 Person person2=session.get(Person.class, 1L);
 transaction.commit();
 session.close();

 System.out.println(person2 == person);

并返回true

b)在Ehcache中使用二级缓存

//1. load person with id 1
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.getTransaction();
transaction.begin();
Person person=session.get(Person.class, 1L);
transaction.commit();
session.close();

//2. load the same person
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.getTransaction();
transaction.begin();
Person person2=session.get(Person.class, 1L);
transaction.commit();
session.close();

System.out.println(person2 == person);

,它返回false

是二级缓存的正常行为吗?还是我错过了什么? 是否有任何二级缓存引擎都只保留同一实体的一个实例(就像一级缓存一样)?

1 个答案:

答案 0 :(得分:0)

这是不可能的,因为每次Hibernate在高速缓存中找到实体时,它都不会使用二级高速缓存在Hibernate的RAM中保留一个实体实例,而只是基于高速缓存的数据创建新实例。

出于我的目的,我已经实现了基于AVL Tree的加载实体和数据库同步引擎,该引擎基于来自休眠的加载实体创建存储库,并异步搜索实体中的所有字段并重写/合并所有相同的字段(因此,字段(pk)与存储库中的实体相同,将其替​​换)

以这种方式与数据库同步很容易,因为它可以在存储库中找到外部更改的实体(因此基本上是在OVL树中,它是O(log n))并重写其字段。