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

标签 java database hibernate caching

我需要确保只创建同一实体的一个对象(因为它是在使用一级 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);

它返回 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

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

最佳答案

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

出于我的目的,我实现了基于 AVL 树的加载实体和数据库同步引擎,该引擎根据 hibernate 中加载的实体创建存储库,并异步搜索实体中的所有字段并重写/合并所有相同的字段(以便如果某些字段(pk)与存储库中的实体相同,它替换了它)

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

关于java - Hibernate二级缓存-同一实体的多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59137704/

相关文章:

java - 如何刷新 Java Web 应用程序中的静态资源?

mysql - 在 MySQL 中设置最终一致性(延迟提交)

php - 从许多表中删除数据的正确方法是什么?

mysql - 将包含数据的csv文件导入mysql

java - 当多个用户使用系统时依赖注入(inject)冲突

sql - 在oracle中使用时间戳比较两个日期

java - 是否可以在 android 中备份和恢复数据库文件?非根设备

java - mvn package命令抛出 "error 401 Unauthorized "

java - 转换为原始类型的奇怪 Java 行为

hibernate - CriteriaQuery 设置可缓存