Java Hibernate二级缓存-同一实体的多个对象
我需要确保只创建同一实体的一个对象(就像使用一级hibernate缓存加载数据时那样,以简化实体刷新),并且我希望使用二级缓存 我正在测试ehcache,但无法使其工作。通常,我的应用程序中的实体嵌套在其他实体中,但这只是一个简单的用法示例: a) 使用工作正常的一级缓存的示例:Java Hibernate二级缓存-同一实体的多个对象,java,database,hibernate,caching,Java,Database,Hibernate,Caching,我需要确保只创建同一实体的一个对象(就像使用一级hibernate缓存加载数据时那样,以简化实体刷新),并且我希望使用二级缓存 我正在测试ehcache,但无法使其工作。通常,我的应用程序中的实体嵌套在其他实体中,但这只是一个简单的用法示例: a) 使用工作正常的一级缓存的示例: session = HibernateUtil.getSessionFactory().openSession(); transaction = session.getTransaction(); transac
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);
这是真的
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
这样做是二级缓存的正常行为还是我遗漏了什么?
任何二级缓存引擎是否只保留同一实体的一个实例(与一级缓存相同)?这不可能使用二级缓存将该实体的一个实例保留在Hibernate的RAM中,因为Hibernate每次在缓存中找到它时,它只是基于缓存数据创建新实例 出于我的目的,我实现了基于AVL树的加载实体和数据库同步引擎,该引擎基于hibernate加载的实体创建存储库,异步搜索实体中的所有字段,并重写/合并所有相同的字段(因此如果某个字段(pk)与存储库中的实体相同,它将替换该实体)
通过这种方式,与数据库的同步很容易,因为它可以在存储库中找到外部更改的实体(基本上是在AVL树中,即O(log n))并重写其字段。看一看。我猜你们的配置是错误的,但因为你们还并没有发布,这是不可能的,我仍然不知道它应该如何工作,它似乎工作,好像我改变了数据库中的一些东西,并试图刷新实体,它返回缓存值,而不是数据库中真实的,修改过的值,但。。。我是否可以像我的示例person2中那样将其设置为object==person(避免数据库中同一实体/行的多个实例)