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



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

我正在测试 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);

它返回假

是二级缓存的正常行为还是我错过了什么? 任何二级缓存引擎是否只保留同一实体的一个实例(如第一级缓存(?

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

出于我的目的,我已经实现了基于 AVL 树的加载实体和数据库同步引擎,该引擎基于从休眠中加载的实体创建存储库,并异步搜索实体中的所有字段并重写/合并所有相同的字段(因此,如果某些字段 (pk( 与存储库中的字段相同, 它取代了它(

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

最新更新