JPA/Hibernate EntityGraph and Cache



使用EntityGraphs时JPA级别1缓存如何工作?

如果我打电话:

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

(我在这里使用弹簧数据,这是我自定义存储库中的一种方法,但这与问题无关(。

这将使用适当的选择语句访问数据库,包括系统和制造商表所需的所有连接。这很好,正如预期的。

但是,如果我称之为:

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

第一个发现调用将使用SELECT到工具表的选择,这是可以的,但是第二个FindOne不会击中数据库,并将从缓存中获取工具实体。这是一个很大的问题,因为缓存的实体没有系统或制造商显然加载了,如果我尝试访问它们,它们将懒洋洋地加载,这是我试图避免使用该实体的方法。

这应该发生吗?我期望第二个呼叫再次击中数据库,因为即使工具实体已经被缓存,实体也指定了来自其他2个未缓存的其他表中的获取实体。如果实体图始终尝试从缓存中获取实体,并且不考虑图表的一部分是否也在缓存中,那么对我而言,此功能基本上是毫无用处的道路。

在两个说明之间清除实体管理器似乎对我有用:

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

缺点是文档所讲述的有关#clear()的信息:

清除持久性上下文,导致所有托管实体被脱离。对尚未冲洗到数据库的实体进行的更改将不会持续。

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

最新更新