JPA [EcliseLink]: Cannot change the type of an instance of parent A to subclass B In the single table inheritance

23 Views Asked by At

I use Eclipselink-2.6 with wildfly-8 server in a JavaEE7 application.

I have three JPA entities A, B, and C.

B and C extend A.

I need to change the type of an entity instance myObjectId A to B, persisting the same id.

I tried to do the following in the same transaction scope:

1- Change the dtype value from "a" to "b" for the instance "myObjectId".

2- save A, flush, then clear cache, using evict, and using ((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().initializeAllIdentityMaps().

3- find by id the new object by the class b em.find(B.class, oldId);

This results in a class cast exception, cannot Cast Class A to B!

Any help would to understand this behavior, and to find a solution would be appreciated.

1

There are 1 best solutions below

3
jane doe On BEST ANSWER

This is what worked for me:

I edited the dtype of instant myObjectId from A to B, and merged it; Detached the entity myObjectId.

Clears the cache of em using: ((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().initializeAllIdentityMaps() Find the entity of type B of id myObjectId.id;

oldId = myObjectId.getId();
myObjectId.setdType("a");
em.merge(myObjectId);
em.flush();
em.detach(myObjectId);

Then, get the new Object b:

((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().initializeAllIdentityMaps();
B newEntity = em.find(B.class, oldId);
// Edited B as filling its fields...
newEntity = em.merge(newEntity);