无法在JPA联接表策略中将父A的实例的类型更改为子类B

问题描述 投票:0回答:1

我们在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仍未更改其类型!?

jpa caching eclipselink wildfly-8
1个回答
0
投票

请参见https://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

本质上,EclipseLink将JPA缓存逐出调用映射到它自己的失效逻辑,该逻辑似乎是使用软引用来保留对对象的引用,以便维护对象身份。这样可以防止A1-> B1-> A1'在具有惰性关系的循环中发生。

尝试按照文档中的建议调用((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().initializeAllIdentityMaps(),然后阅读更改的类。

© www.soinside.com 2019 - 2024. All rights reserved.