Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate二级缓存-同一实体的多个对象_Java_Database_Hibernate_Caching - Fatal编程技术网

Java Hibernate二级缓存-同一实体的多个对象

Java Hibernate二级缓存-同一实体的多个对象,java,database,hibernate,caching,Java,Database,Hibernate,Caching,我需要确保只创建同一实体的一个对象(就像使用一级hibernate缓存加载数据时那样,以简化实体刷新),并且我希望使用二级缓存 我正在测试ehcache,但无法使其工作。通常,我的应用程序中的实体嵌套在其他实体中,但这只是一个简单的用法示例: a) 使用工作正常的一级缓存的示例: session = HibernateUtil.getSessionFactory().openSession(); transaction = session.getTransaction(); transac

我需要确保只创建同一实体的一个对象(就像使用一级hibernate缓存加载数据时那样,以简化实体刷新),并且我希望使用二级缓存

我正在测试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);
这是真的

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(避免数据库中同一实体/行的多个实例)