NullPointerException when reading an audited entity that has a collection of embeddables with a ManyToOne to an unaudited entity.

Description

When using an audited entity collection of an embeddable:

@Audited public class Parent { // ... @ElementCollection @CollectionTable(name = "items", joinColumns = @JoinColumn(name = "PRODUCT_ID")) @OrderColumn(name = "ORDER_COL") @Audited private List<Item> items = new ArrayList<Item>(); } @Embeddable @Audited public class Item { // ... @ManyToOne @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) private Type type; }

This causes a NullPointerException to occur when fetching a revision of the Parent entity when the embeddable Item contains a non-null reference to Type, which is not audited. This is only an issue when the embeddable class holds a reference to a non-audited entity.

Attachments

1
  • 31 Oct 2016, 06:27 AM

Web links

Activity

Show:

Former user June 23, 2017 at 10:32 PM

Fixed in 5.1 branch as well.

Dmitriy Sulimchuk November 7, 2016 at 1:06 PM

Yes, exceptition thrown out from org.hibernate.envers.exception.AuditException: java.lang.NullPointerException

Chris Cranford November 2, 2016 at 3:05 PM

Based on porting your test case, it looks like the NullPointerException is thrown from:

org.hibernate.envers.exception.AuditException: java.lang.NullPointerException at org.hibernate.envers.internal.entities.mapper.relation.component.MiddleEmbeddableComponentMapper.mapToObjectFromFullMap(MiddleEmbeddableComponentMapper.java:55) at org.hibernate.envers.internal.entities.mapper.relation.lazy.initializor.ListCollectionInitializor.addToCollection(ListCollectionInitializor.java:66) at org.hibernate.envers.internal.entities.mapper.relation.lazy.initializor.ListCollectionInitializor.addToCollection(ListCollectionInitializor.java:23) at org.hibernate.envers.internal.entities.mapper.relation.lazy.initializor.AbstractCollectionInitializor.initialize(AbstractCollectionInitializor.java:54) at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.checkInit(CollectionProxy.java:33) at org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.CollectionProxy.hashCode(CollectionProxy.java:130) at org.hibernate.envers.test.integration.collection.embeddable.NullPointerExceptionTest$Product.hashCode(NullPointerExceptionTest.java:159) at org.hibernate.envers.internal.tools.Triple.hashCode(Triple.java:63) at java.util.HashMap.hash(HashMap.java:338) at java.util.HashMap.put(HashMap.java:611) at org.hibernate.envers.internal.reader.FirstLevelCache.putOnEntityNameCache(FirstLevelCache.java:87) at org.hibernate.envers.internal.entities.EntityInstantiator.createInstanceFromVersionsEntity(EntityInstantiator.java:111) at org.hibernate.envers.internal.entities.EntityInstantiator.addInstancesFromVersionsEntities(EntityInstantiator.java:164) at org.hibernate.envers.query.internal.impl.AbstractAuditQuery.applyProjections(AbstractAuditQuery.java:336) at org.hibernate.envers.query.internal.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:128) at org.hibernate.envers.query.internal.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:111) at org.hibernate.envers.internal.reader.AuditReaderImpl.find(AuditReaderImpl.java:124) at org.hibernate.envers.internal.reader.AuditReaderImpl.find(AuditReaderImpl.java:93) at org.hibernate.envers.internal.reader.AuditReaderImpl.find(AuditReaderImpl.java:87) at org.hibernate.envers.test.integration.collection.embeddable.NullPointerExceptionTest.testRevision2(NullPointerExceptionTest.java:96) 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.RunAfters.evaluate(RunAfters.java:27) at org.hibernate.testing.junit4.FailureExpectedHandler.evaluate(FailureExpectedHandler.java:41) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.hibernate.testing.junit4.BeforeClassCallbackHandler.evaluate(BeforeClassCallbackHandler.java:26) at org.hibernate.testing.junit4.AfterClassCallbackHandler.evaluate(AfterClassCallbackHandler.java:25) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) 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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) Caused by: java.lang.NullPointerException at org.hibernate.envers.internal.entities.EntitiesConfigurations.getRelationDescription(EntitiesConfigurations.java:101) at org.hibernate.envers.internal.entities.mapper.relation.ToOneIdMapper.nullSafeMapToEntityFromMap(ToOneIdMapper.java:107) at org.hibernate.envers.internal.entities.mapper.relation.AbstractToOneMapper.mapToEntityFromMap(AbstractToOneMapper.java:57) at org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper.mapToEntityFromMap(MultiPropertyMapper.java:161) at org.hibernate.envers.internal.entities.mapper.relation.component.MiddleEmbeddableComponentMapper.mapToObjectFromFullMap(MiddleEmbeddableComponentMapper.java:44)

Does that seem right based on your observation ?

Fixed

Details

Assignee

Reporter

Fix versions

Affects versions

Priority

Created October 31, 2016 at 6:27 AM
Updated June 23, 2017 at 10:35 PM
Resolved June 23, 2017 at 10:32 PM