Skip to content

Conversation

@garydgregory
Copy link
Contributor

@garydgregory garydgregory commented Jan 25, 2022

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>...

@hibernate-github-bot
Copy link

hibernate-github-bot bot commented Jan 25, 2022

Thanks for your pull request!

This pull request appears to follow the contribution rules.

› This message was automatically generated.

StatefulPersistenceContext.extractNaturalIdValues(). See example below.

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 garydgregory force-pushed the NullPointerExcception_StatefulPersistenceContext branch from a703cb4 to ae337bf Compare January 25, 2022 23:54
@garydgregory garydgregory changed the title Fix NullPointerException in StatefulPersistenceContext.extractNaturalIdValues() HHH-15050 Fix NullPointerException in StatefulPersistenceContext.extractNaturalIdValues() Jan 25, 2022
@sebersole
Copy link
Member

Could you add a test for this please?

@garydgregory
Copy link
Contributor Author

garydgregory commented Jan 27, 2022

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 ;-)

@sebersole
Copy link
Member

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

@garydgregory
Copy link
Contributor Author

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

Thank you @sebersole

@garydgregory
Copy link
Contributor Author

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

@sebersole
Copy link
Member

sebersole commented Mar 16, 2022 via email

@garydgregory
Copy link
Contributor Author

Ping out of curiosity ;-)

@gavinking
Copy link
Member

This is very stale:

  • the offending code is gone, AFAICT,
  • the linked issue autoclosed itself, and
  • no test was ever supplied.

@gavinking gavinking closed this Nov 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants