当前位置: 首页 > 知识库问答 >
问题:

JPA/Hibernate实体图和缓存

祁正阳
2023-03-14

使用实体图时,JPA Level 1缓存是如何工作的?

如果我打电话:

Tool tool = toolRepository.findOne(id, CustomEntityGraph.fromAttributes(new String[] { "system", "manufacturer" }, EntityGraphType.LOAD));

(顺便说一下,我在这里使用Spring Data,这是我自定义存储库中的一个方法,但这与问题无关)。

这将使用适当的SELECT语句访问数据库,该语句包括系统和制造商表所需的所有连接。这是完美的工作和预期。

然而,如果我称之为:

Tool tool = toolRepository.findOne(id);
Tool toolEg = toolRepository.findOne(id, CustomEntityGraph.fromAttributes(new String[] { "system", "manufacturer" }, EntityGraphType.LOAD));

第一个findOne调用将仅通过选择工具表来命中数据库,这是正常的,但第二个findOne不会命中数据库,并将从缓存中获取工具实体。这是一个大问题,因为缓存的实体显然没有加载系统或制造商,如果我尝试访问它们,它们将被延迟加载,这是我试图使用EntityGraph避免的。

这应该发生吗?我期望第二次调用再次命中数据库,因为即使工具实体已经缓存,EntityGgraph也会指定从其他2个未缓存的表中获取实体。如果实体图总是试图从缓存中获取实体,并且不考虑作为图的一部分的属性是否也在缓存中,那么对我来说,这个特性基本上是无用的,因为它只会带来很多问题。

共有1个答案

沈树
2023-03-14

在两个指令之间清除实体管理器似乎对我有效:

Tool tool = toolRepository.findOne(id);
em.clear();
Tool toolEg = toolRepository.findOne(id, CustomEntityGraph.fromAttributes(new String[] { "system", "manufacturer" }, EntityGraphType.LOAD));

缺点是文档中讲述的#clear()

清除持久性上下文,导致所有托管实体变得分离。对尚未刷新到数据库的实体所做的更改将不会被保留。

我尝试与#disach(工具)但不工作。

 类似资料:
  • 问题内容: 当我使用@Entity注释类并尝试解析依赖项时,我可以在两个不同的包javax.persistence.Entity和org.hibernate.annotations.Entity中选择包。 javax包是JPA的实体注释,但是为什么会有hibernate的实体注释,它与JPA的注释有区别?仅仅是允许定义更多属性的扩展吗? 问题答案: 具有一些尚未标准化的额外属性。仅当直接使用hib

  • 问题内容: 我正在使用Spring + Hibernate+JPA,但遇到无法将实体持久保存到数据库的情况。我已经建立了一个带有@Transactional注释的服务类。它使用包含注入的EntityManager的DAO。当我在服务对象上调用函数时,我看到DAO正在进行大量的选择读取,但是由于我的DAO发出的合并和删除操作,没有更新/删除。当然,我的设置有问题,但是我看不到它。 persisten

  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应

  • 我无法看到我错过配置了什么。 你能告诉我,我可以做什么来解决这个问题,并使实体持久化到数据存储吗?

  • 我一个新的使用Hibernate缓存(一级,二级和查询缓存)。 我的项目是使用SpringMVC和JPA配置的。 我正在使用下面的JUnit测试用例测试一级缓存。 我的实体类定义为: 如果默认情况下启用了一级缓存,则应该执行一次本机查询。但我在执行此查询时得到以下结果: 以下是我的持久性相关配置: 有人能帮我解决一个问题或者我做错了什么吗? 提前感谢!

  • 问题内容: 如果我回滚,会话中的实体会怎样?他们会在交易之前回到状态吗?特别是他们会获得新的ID吗? 例: 更新 : 我已经进行了Hibernate 4测试。测试后,该实体已成为新的ID。 问题答案: 我将简单地引用JPA实现(3.3.2事务回滚): 对于事务范围和扩展的持久性上下文,事务回滚都会导致所有先前存在的托管实例和已删除实例[31]分离。实例的状态将是事务回滚时的实例状态。事务回滚通常会