Test case: https://github.com/arosinijc/hibernate-map-entity
The problem seems to be that when a DynamicMapEntityTupilzer is registered, it applies itself gets applied to any entity which matches Map.class.isInstance( entity ) when determining the type of entity . Since the entity in question passes that check, but doesn't provide its entity type under the $type$ key, org.hibernate.tuple.entity.DynamicMapEntityTuplizer.BasicEntityNameResolver#resolveEntityName(Object) throws the following exception:
{code} javax.persistence.PersistenceException: org.hibernate.HibernateException: Could not determine type of dynamic map entity at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811) at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789) at org.hibernate.envers.bugs.EnversUnitTestCase.persistEntityWhichImplementsMap(EnversUnitTestCase.java:108) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.hibernate.testing.junit4.ExtendedFrameworkMethod.invokeExplosively(ExtendedFrameworkMethod.java:45) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298) at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.lang.Thread.run(Thread.java:745) Caused by: org.hibernate.HibernateException: Could not determine type of dynamic map entity at org.hibernate.tuple.entity.DynamicMapEntityTuplizer$BasicEntityNameResolver.resolveEntityName(DynamicMapEntityTuplizer.java:126) at org.hibernate.internal.CoordinatingEntityNameResolver.resolveEntityName(CoordinatingEntityNameResolver.java:33) at org.hibernate.internal.SessionImpl.guessEntityName(SessionImpl.java:2339) at org.hibernate.internal.SessionImpl.bestGuessEntityName(SessionImpl.java:2304) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:97) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:62) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:804) ... 17 more {code}
If the entity in the test provided isn't marked as Audited, no map entities are ever registered and so no DynamicMapEntityTupilzer is ever registered and the entity is able to be persisted. I suspect this has nothing to do with envers other than that registration, which could happen with any entity which is map mode. |
|