[
https://hibernate.onjira.com/browse/HHH-6960?page=com.atlassian.jira.plug...
]
Stefan Hildebrandt commented on HHH-6960:
-----------------------------------------
Some debugging:
collectionEntry lockes like this:
collectionEntry = org.hibernate.engine.spi.CollectionEntry@7952
snapshot = null
role = null
loadedPersister = null
loadedKey = null
reached = false
processed = true
doupdate = false
doremove = true
docreate = false
ignore = false
currentPersister = null
currentKey = null
Looks like a remove event. Possible there was a remove event within a prior flush, thats
removed the entity.
Code that checks this:
{code}
private static final IdentityHashMap<PersistentCollection, CollectionEntry>
identityHashMap
= new IdentityHashMap<PersistentCollection, CollectionEntry>();
@Override
public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
CollectionEntry collectionEntry = getCollectionEntry( event );
if ( collectionEntry != null
&& !(collectionEntry.isDoremove()
&&identityHashMap.containsKey(event.getCollection()))
&& !collectionEntry.getLoadedPersister().isInverse() ) {
onCollectionAction( event, null, collectionEntry.getSnapshot(), collectionEntry
);
}
if(collectionEntry.isDoremove()){
identityHashMap.put(event.getCollection(), collectionEntry);
}
}
{code}
All Tests are running!
After that, the following code seams to be save.
{code}
@Override
public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
CollectionEntry collectionEntry = getCollectionEntry( event );
if ( collectionEntry != null
&& !(collectionEntry.getCurrentPersister() == null &&
collectionEntry.isDoremove() && collectionEntry.isProcessed())
&& !collectionEntry.getLoadedPersister().isInverse() ) {
onCollectionAction( event, null, collectionEntry.getSnapshot(), collectionEntry
);
}
if(collectionEntry.isDoremove()){
identityHashMap.put(event.getCollection(), collectionEntry);
}
}
{code}
NullPointerException in PreCollectionRemove Listener
----------------------------------------------------
Key: HHH-6960
URL:
https://hibernate.onjira.com/browse/HHH-6960
Project: Hibernate ORM
Issue Type: Bug
Components: envers
Affects Versions: 4.0.0.Final
Environment: Hibernate 4.0.0 to MySQL
Reporter: Kevin Jordan
Assignee: Gail Badner
I'm getting a NullPointerException on line 47 of
EnversPreCollectionRemoveEventListenerImpl very consistently. I wasn't sure if it was
due to lazy collections or not, but it seems that it fails if they're eagerly fetched
or lazily fetched. I'm guessing it has something to do with getLoadedPersister()
returning a null value since the comments for it say "This is only available late
during the flush cycle". The stack trace is
Quote:
java.lang.NullPointerException
at
org.hibernate.envers.event.EnversPreCollectionRemoveEventListenerImpl.onPreRemoveCollection(EnversPreCollectionRemoveEventListenerImpl.java:47)
at
org.hibernate.action.internal.CollectionRemoveAction.preRemove(CollectionRemoveAction.java:143)
at
org.hibernate.action.internal.CollectionRemoveAction.execute(CollectionRemoveAction.java:104)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:273)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:265)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:188)
at
org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:323)
at
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1081)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:315)
at
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at
org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73)
... 120 more
--
This message is automatically generated by JIRA.
For more information on JIRA, see:
http://www.atlassian.com/software/jira