我需要确保只创建同一实体的一个对象(就像使用第一级休眠缓存加载数据时所做的那样,以简化实体刷新(,我想使用二级缓存。
我正在测试 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 树中(并重写其字段。