我们在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以及Entitymanger清除缓存。
[之后,当我尝试查找类型B的所有数据时,对象“ myObjectId”出现在列表中,但类型为A!
重新启动wildfly服务器并调用findAll之后,因此数据来自类型B!
为什么即使清除了第一级和第二级缓存,myObjectId仍未更改其类型!?
请参见https://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching
本质上,EclipseLink将JPA缓存逐出调用映射到它自己的失效逻辑,该逻辑似乎是使用软引用来保留对对象的引用,以便维护对象身份。这样可以防止A1-> B1-> A1'在具有惰性关系的循环中发生。
尝试按照文档中的建议调用((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().initializeAllIdentityMaps()
,然后阅读更改的类。