hibernate-orm icon indicating copy to clipboard operation
hibernate-orm copied to clipboard

HHH-15050 Fix NullPointerException in StatefulPersistenceContext.extractNaturalIdValues()

Open garydgregory opened this issue 3 years ago • 7 comments

StatefulPersistenceContext.extractNaturalIdValues(). See example below.

https://hibernate.atlassian.net/browse/HHH-15050

Caused by: java.lang.NullPointerException
	at org.hibernate.engine.internal.StatefulPersistenceContext$1.extractNaturalIdValues(StatefulPersistenceContext.java:2163)
	at org.hibernate.persister.entity.AbstractEntityPersister.handleNaturalIdReattachment(AbstractEntityPersister.java:4956)
	at org.hibernate.persister.entity.AbstractEntityPersister.afterReassociate(AbstractEntityPersister.java:4930)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:322)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:95)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)
	at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:670)
	at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:663)
	at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:219)
	at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:510)
	at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:434)
	at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:220)
	at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:153)
	at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:65)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:361)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:334)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:230)
	at org.hibernate.event.internal.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:38)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)
	at org.hibernate.internal.SessionImpl.fireUpdate(SessionImpl.java:712)
	at org.hibernate.internal.SessionImpl.update(SessionImpl.java:705)
	at org.hibernate.internal.SessionImpl.update(SessionImpl.java:700)
    ...<snip>...

garydgregory avatar Jan 25 '22 23:01 garydgregory

Thanks for your pull request!

This pull request appears to follow the contribution rules.

› This message was automatically generated.

Could you add a test for this please?

sebersole avatar Jan 27 '22 00:01 sebersole

Hi @sebersole ,

Unfortunately, I don't want to take more time away from work and my open-source time away from Log4j ATM.

This is part of a large proprietary application and it would likely take days and days to try and create something to reproduce this NullPointerException with no guarantee of a payoff. All I can say is that this might (maybe) be related to having an annotation @Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE })

The NPE happens all the time after I add the Cascade, so it's not random at least. Fixing the one NPE is simple as this PR does. Hopefully, the stack trace helps some.

The larger issue IMO is that org.hibernate.persister.entity.EntityPersister.getNaturalIdentifierProperties() is documented to return null and from a quick review, more than just this one call site do not account for a null result and will also throw NPEs. This requires deeper knowledge of the codebase than I can invest to gather now. Hence, this rambling ;-)

garydgregory avatar Jan 27 '22 15:01 garydgregory

Yep. I'll get to this when I find some time to write a test

sebersole avatar Jan 27 '22 18:01 sebersole

Yep. I'll get to this when I find some time to write a test

Thank you @sebersole

garydgregory avatar Jan 27 '22 21:01 garydgregory

I guessed this one missed the train for 5.6.6...

garydgregory avatar Mar 16 '22 17:03 garydgregory

Well I did say when I have time. Been super busy with Hibernate 6. Again, we will get to it when we have time.

On Wed, Mar 16, 2022, 12:57 PM Gary Gregory @.***> wrote:

I guessed this one missed the train for 5.6.6...

— Reply to this email directly, view it on GitHub https://github.com/hibernate/hibernate-orm/pull/4706#issuecomment-1069399145, or unsubscribe https://github.com/notifications/unsubscribe-auth/AABZIE6HUO2RBR5G2L62JZTVAIOIBANCNFSM5MZUEWUQ . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.

You are receiving this because you were mentioned.Message ID: @.***>

sebersole avatar Mar 16 '22 22:03 sebersole

Ping out of curiosity ;-)

garydgregory avatar Dec 07 '22 03:12 garydgregory