我们在JavaEE7应用程序中使用Eclipselink-2.6和wildfly-8服务器。
我们有三个JPA实体A、B和C。
B和C扩展了A。
为了将对象"myObjectId“A的类型更改为B,我们尝试:
1-使用条件查询将实例"myObjectId“的表"a”中的dtype值从"A“更改为"b”。
2-在数据库中的表"B“中为同样的id "myObjectId”创建一个新行,也带有一个条件查询。
3-通过evictAll以及使用clear函数的实体管理器清除缓存。
之后,当我试图查找所有类型为B的数据时,对象"myObjectId“出现在列表中,但类型为A!
因此,在重启wildfly服务器并调用findAll之后,数据带有类型B!
为什么即使第一级和第二级缓存被清除,myObjectId也不改变它的类型!?
发布于 2020-01-04 03:13:26
请参阅https://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching
本质上,EclipseLink将JPA缓存逐出调用映射到它自己的无效逻辑,该逻辑似乎使用软引用来保持对对象的引用,以便维护对象身份。这防止了A1->B1->A1‘在具有惰性关系的循环中发生。
尝试按照文档中的建议调用((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().initializeAllIdentityMaps(),然后读取更改后的类。
https://stackoverflow.com/questions/59421816
复制相似问题