Test case: https://github.com/arosinijc/hibernate-map-entity
The problem seems to be that when a DynamicMapEntityTupilzer is registered, it applies itself to any entity which matches Map.class.isInstance( 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:62) 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 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. |
|