eclipselink icon indicating copy to clipboard operation
eclipselink copied to clipboard

NPE on `getObjectChangeSet().getChangesForAttributeNamed()`

Open inad9300 opened this issue 8 months ago • 3 comments

Describe the bug

I encountered the following null pointer exception:

Cannot invoke "org.eclipse.persistence.internal.sessions.ObjectChangeSet.getChangesForAttributeNamed(String)" 
because the return value of "org.eclipse.persistence.internal.descriptors.changetracking.AttributeChangeListener.getObjectChangeSet()" is null
  • EclipseLink version: 4.0.5
  • Java/JDK version: 21

The following line seems most likely to be the culprit:

https://github.com/eclipse-ee4j/eclipselink/blob/dfc411d38767f696ce9f2741de051aef050cbeba/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/AttributeChangeTrackingPolicy.java#L142

Unfortunately, I have no further details than this.

inad9300 avatar May 16 '25 14:05 inad9300

Any chance of preventing this NPE from being thrown?

inad9300 avatar Aug 21 '25 15:08 inad9300

Hello, Eclipselink team !

+1 on this issue. I have a similar issue with a NPE on : Cannot invoke "org.eclipse.persistence.internal.sessions.CollectionChangeRecord.getAddObjectList()" because "changeRecord" is null

EL version : 4.0.4 Java version : 17

This append when i'm cloning and replacing an entity on a parent entity Example :

Entity "Structure" A has a "File" A with all its child entities Entity "Structure" B has a "File" B with all its child entities

I'm cloning File B and assign it to Structure A in replacement of file A (with java.lang.cloneable)

Static weaving is enabled, the issue does not append when static weaving isn't applied Entity tracking is not enabled on these entities

Full stack trace :

java.lang.NullPointerException: Cannot invoke "org.eclipse.persistence.internal.sessions.CollectionChangeRecord.getAddObjectList()" because "changeRecord" is null
	at org.eclipse.persistence.internal.queries.ListContainerPolicy.updateChangeRecordForSelfMerge(ListContainerPolicy.java:182)
	at org.eclipse.persistence.mappings.CollectionMapping.updateChangeRecordForSelfMerge(CollectionMapping.java:2146)
	at org.eclipse.persistence.descriptors.changetracking.AttributeChangeTrackingPolicy.updateListenerForSelfMerge(AttributeChangeTrackingPolicy.java:138)
	at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1649)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4281)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:612)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:324)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.mergeIntoObject(ObjectReferenceMapping.java:525)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4281)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:612)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:324)
	at org.eclipse.persistence.mappings.ObjectReferenceMapping.mergeIntoObject(ObjectReferenceMapping.java:525)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4281)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:612)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:324)
	at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1645)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4281)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:612)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:324)
	at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1645)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4281)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:612)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:324)
	at org.eclipse.persistence.mappings.CollectionMapping.mergeIntoObject(CollectionMapping.java:1645)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.mergeIntoObject(ObjectBuilder.java:4281)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:612)
	at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:324)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3681)
	at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.mergeCloneWithReferences(RepeatableWriteUnitOfWork.java:402)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3641)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.mergeInternal(EntityManagerImpl.java:644)
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.merge(EntityManagerImpl.java:622)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:319)
	at jdk.proxy3/jdk.proxy3.$Proxy85.merge(Unknown Source)

Is there some chance to handle this NPE correctly ? Thanks !

toutiyeti avatar Oct 10 '25 14:10 toutiyeti

Hello, in attachment You can find some initial test case (Maven project with Apache Derby DB which should be started by mvn derby:run in the project directory). This test case com.oracle.jpa.bugtest.TestBug#testEL2415 doesn't leads into mentioned exception yet. I'd like ask You to clarify based on attachement following:

  • entity definitions com.oracle.jpa.bugtest.domain (clone methods?)
  • persistence.xml settings (if there are some special/additional settings like SessionListener....)
  • in com.oracle.jpa.bugtest.TestBug#testEL2415 add to the end operations which leads into mentioned error ()

From the provided descriptions it's not clear to me what exactly lead into NPE error.

jpa-bug-2415-NPEOnGetObjectChangeSetGetChangesForAttributeNamed.tar.gz

rfelcman avatar Oct 15 '25 13:10 rfelcman