Hi
Ok folgendes Problem:
Ich versuche gerade eine In Memory Datenbank (HSQLDB/Hibernate) zu testen.
Dazu schreibe ich meine Testklassen und einen Basistest. Die Testklassen werden vom Basistest abgeleitet. Im Basistest stehen die SetUpBeforeClass und die TearDownAfterClass.
Setup: Datensätze werden eingespielt
TearDown:
Die beiden werden vor und nach jeder Testklasse ausgeführt.
Allerdings führt der Truncate Befehl zu folgendem Fehler:
Die Entitys: Patient und Admin leiten sich beide von User ab.
Die erste Testklasse (AdminDao Test) wird normal ausgeführt.
Die zweite Testklasse (PatientDao Test) kann keine Objekte (Patienten) in der Datenbank mehr anlegen. Alleine funktioniert die Testklasse aber.
Die Exception sieht wie folgt aus:
Sry für die wall of text...
Ich werde aus der Fehlermeldung nicht schlau... Und der Truncate Befehl sollte doch nur alle Tables leeren und die ID counter zurücksetzen. Was tut dieser Befehl noch, was ich übersehe? Leider sind Hibernate und In Memory Datenbanken eine ziemliche Blackbox für mich... die Exception sieht irgendwie nach einem Fehler in den Entitys aus, aber da der Patiententest alleine funktioniert (und auch funktioniert wenn ich den Truncate Befehl auskommentiere), bin ich etwas ratlos...
Danke im Voraus
Osiris
Ok folgendes Problem:
Ich versuche gerade eine In Memory Datenbank (HSQLDB/Hibernate) zu testen.
Dazu schreibe ich meine Testklassen und einen Basistest. Die Testklassen werden vom Basistest abgeleitet. Im Basistest stehen die SetUpBeforeClass und die TearDownAfterClass.
Setup: Datensätze werden eingespielt
TearDown:
Code:
final EntityManagerFactory emf = Persistence
.createEntityManagerFactory("webres");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.createNativeQuery("TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK").executeUpdate();
em.getTransaction().commit();
em.close();
emf.close();
Die beiden werden vor und nach jeder Testklasse ausgeführt.
Allerdings führt der Truncate Befehl zu folgendem Fehler:
Die Entitys: Patient und Admin leiten sich beide von User ab.
Die erste Testklasse (AdminDao Test) wird normal ausgeführt.
Die zweite Testklasse (PatientDao Test) kann keine Objekte (Patienten) in der Datenbank mehr anlegen. Alleine funktioniert die Testklasse aber.
Die Exception sieht wie folgt aus:
Code:
javax.persistence.RollbackException: Exception [EclipseLink-26] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Trying to get value for instance variable [exercises] of type [java.util.Set] from the object [webres.entity.Admin]. The specified object is not an instance of the class or interface declaring the underlying field.
Internal Exception: java.lang.IllegalArgumentException: Can not set java.util.Set field webres.entity.Patient.exercises to webres.entity.Admin
Mapping: org.eclipse.persistence.mappings.OneToManyMapping[exercises]
Descriptor: RelationalDescriptor(webres.entity.Patient --> [DatabaseTable(user)])
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)
at webres.dao.GenericDaoJpa.commit(GenericDaoJpa.java:65)
at webres.dao.GenericDaoJpa.commitAndCloseTransaction(GenericDaoJpa.java:95)
at dao.TestPatientDao.createPatient(TestPatientDao.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: Exception [EclipseLink-26] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Trying to get value for instance variable [exercises] of type [java.util.Set] from the object [webres.entity.Admin]. The specified object is not an instance of the class or interface declaring the underlying field.
Internal Exception: java.lang.IllegalArgumentException: Can not set java.util.Set field webres.entity.Patient.exercises to webres.entity.Admin
Mapping: org.eclipse.persistence.mappings.OneToManyMapping[exercises]
Descriptor: RelationalDescriptor(webres.entity.Patient --> [DatabaseTable(user)])
at org.eclipse.persistence.exceptions.DescriptorException.illegalArgumentWhileGettingValueThruInstanceVariableAccessor(DescriptorException.java:645)
at org.eclipse.persistence.internal.descriptors.InstanceVariableAttributeAccessor.getAttributeValueFromObject(InstanceVariableAttributeAccessor.java:79)
at org.eclipse.persistence.mappings.DatabaseMapping.getAttributeValueFromObject(DatabaseMapping.java:574)
at org.eclipse.persistence.mappings.ForeignReferenceMapping.getAttributeValueFromObject(ForeignReferenceMapping.java:910)
at org.eclipse.persistence.mappings.DatabaseMapping.getRealAttributeValueFromObject(DatabaseMapping.java:727)
at org.eclipse.persistence.mappings.CollectionMapping.getRealCollectionAttributeValueFromObject(CollectionMapping.java:1080)
at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1459)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:3544)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeChangesIntoObject(ObjectBuilder.java:3477)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfWorkingCopyIntoOriginal(MergeManager.java:878)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfWorkingCopyIntoOriginal(MergeManager.java:687)
at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:307)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeChangesIntoParent(UnitOfWorkImpl.java:3260)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.mergeChangesIntoParent(RepeatableWriteUnitOfWork.java:369)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:283)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1147)
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:84)
... 31 more
Caused by: java.lang.IllegalArgumentException: Can not set java.util.Set field webres.entity.Patient.exercises to webres.entity.Admin
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:372)
at org.eclipse.persistence.internal.descriptors.InstanceVariableAttributeAccessor.getAttributeValueFromObject(InstanceVariableAttributeAccessor.java:76)
... 46 more
Ich werde aus der Fehlermeldung nicht schlau... Und der Truncate Befehl sollte doch nur alle Tables leeren und die ID counter zurücksetzen. Was tut dieser Befehl noch, was ich übersehe? Leider sind Hibernate und In Memory Datenbanken eine ziemliche Blackbox für mich... die Exception sieht irgendwie nach einem Fehler in den Entitys aus, aber da der Patiententest alleine funktioniert (und auch funktioniert wenn ich den Truncate Befehl auskommentiere), bin ich etwas ratlos...
Danke im Voraus
Osiris
Zuletzt bearbeitet: