ObjectDB ObjectDB

Schema-Update: Rename superclass and remove one subclass

#1

Hello,

we renamed a superclass and removed one of the subclass.

If we then try to open the Database (with ObjectDB-Explorer) we get a "Failed to generate dynamic type ..."

 

Small Example:

Generate Database

public static void main(String[] args) {
  EntityManagerFactory emf = Persistence.createEntityManagerFactory("objectdb:test.tmp;drop");
  EntityManager em = emf.createEntityManager();

  // // Persist an entity
  em.getTransaction().begin();
  ChildClassA entity1 = new ChildClassA();
  entity1.kind = "kindA";
  entity1.mode = "modeB";
  em.persist(entity1);
  ChildClassA entity2 = new ChildClassA();
  entity2.kind = "kindC";
  entity2.mode = "modeD";
  em.persist(entity2);
  ChildClassB entity3 = new ChildClassB();
  entity3.onlyRecordLastStep = false;
  em.persist(entity3);
  em.getTransaction().commit();

  em.close();
  emf.close();
}

Entities:


@Entity

@Access(AccessType.FIELD)
public class SuperClass {

  public SuperClass() {
  }
}

ChildClassA:


@Entity

@Access(AccessType.FIELD)
public class ChildClassA extends SuperClass {


@Basic public String kind;


@Basic public String mode;

  protected ChildClassA() {
  }
}

ChildClassB:


@Entity

@Access(AccessType.FIELD)
public class ChildClassB extends SuperClass {


@Basic
public boolean onlyRecordLastStep = false;

  protected ChildClassB() {
  }
}

 

Then we rename SuperClass to RenamedSuperClass and Remove the ChildClassB.

<schema>
    <package name="schemaupdate.delete">
         <class name="SuperClass" new-name="RenamedSuperClass" />
    </package>
</schema>

 


@Entity

@Access(AccessType.FIELD)
public class RenamedSuperClass {

  public RenamedSuperClass() {
  }
}

 


@Entity

@Access(AccessType.FIELD)
public class ChildClassA extends RenamedSuperClass {


@Basic public String kind;


@Basic public String mode;

  protected ChildClassA() {
  }
}

And then we access the prevous create Database with the following example:

public static void main(String[] args) {

  // no drop - reuse the existing file
  EntityManagerFactory emf = Persistence.createEntityManagerFactory("objectdb:test.tmp");
  EntityManager em = emf.createEntityManager();

  // don't create a new objects!
  // access the existing

  emf.getMetamodel().entity(RenamedSuperClass.class);

  em.getTransaction().begin();
  // do something
  ChildClassA entityWithID1 = em.find(ChildClassA.class, 1);
  entityWithID1.mode = "a";
  ChildClassA entityWithID2 = em.find(ChildClassA.class, 2);
  entityWithID2.mode = "b";
  em.getTransaction().commit();

  em.close();
  emf.close();
}

If we try to open the database with the ObjectDB-Explorer we get the described error message.

 

If we try to ecexute a Query (in the second main method):

TypedQuery<RenamedSuperClass> q = em.createQuery("SELECT c FROM " + RenamedSuperClass.class.getName() + " c",
    RenamedSuperClass.class);
 List<RenamedSuperClass> result = q.getResultList();
 System.out.println("size: " + result.size());

We get an exception:

[2016-11-14 10:48:56 #1 *]
java.lang.NullPointerException
at com.objectdb.o.ENH.g(ENH.java:401)
at com.objectdb.o.OBC.aM(OBC.java:951)
at com.objectdb.o.OBC.UZ(OBC.java:798)
at com.objectdb.o.SRB.l(SRB.java:160)
at com.objectdb.o.QRR.m(QRR.java:549)
at com.objectdb.o.QRR.f(QRR.java:212)
at com.objectdb.jpa.JpaQuery.getResultList(JpaQuery.java:719)
at schemaupdate.delete.UpdateDB.main(UpdateDB.java:32)

Exception in thread "main" [ObjectDB 2.6.9_07] Unexpected exception (Error 990)
  Generated by Java HotSpot(TM) 64-Bit Server VM 1.8.0_51 (on Windows 7 6.1).
Please report this error on http://www.objectdb.com/database/issue/new
com.objectdb.o.InternalException: java.lang.NullPointerException: null
java.lang.NullPointerException
at com.objectdb.o.ENH.g(ENH.java:401)
at com.objectdb.o.OBC.aM(OBC.java:951)
at com.objectdb.o.OBC.UZ(OBC.java:798)
at com.objectdb.o.SRB.l(SRB.java:160)
at com.objectdb.o.QRR.m(QRR.java:549)
at com.objectdb.o.QRR.f(QRR.java:212)
at com.objectdb.jpa.JpaQuery.getResultList(JpaQuery.java:719)
at schemaupdate.delete.UpdateDB.main(UpdateDB.java:32)
edit
delete
#2

Thank you for this report and for the test. It demonstrates well a bug in schema evolution that includes renaming a super class and removing one of its subclasses at the same time. This report was moved to the issue tracking for further discussion and tracking.

ObjectDB Support
edit
delete

Reply

To post on this website please sign in.