gpt4 book ai didi

hibernate - JPA/Hibernate EntityGraph 和缓存

转载 作者:行者123 更新时间:2023-12-05 06:40:02 25 4
gpt4 key购买 nike

使用 EntityGraphs 时 JPA 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 调用将通过对 Tool 表的 SELECT 访问数据库,这没问题,但第二个 findOne 不会访问数据库,而是从缓存中获取 Tool 实体。这是一个大问题,因为缓存的实体显然没有加载系统或制造商,如果我尝试访问它们,它们将被延迟加载,这是我试图通过 EntityGraph 避免的。

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

最佳答案

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

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

缺点是文档对 #clear() 的描述:

Clear the persistence context, causing all managed entities to become detached. Changes made to entities that have not been flushed to the database will not be persisted.

我尝试使用 #detach(tool) 但不起作用。

关于hibernate - JPA/Hibernate EntityGraph 和缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43736691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com