Skip to content

Commit 8a90a4a

Browse files
committed
HHH-19547 fix an exception message that has been fixed and unfixed many times
"oid" never meant "old id"
1 parent c06ce9c commit 8a90a4a

File tree

1 file changed

+19
-21
lines changed

1 file changed

+19
-21
lines changed

hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -70,28 +70,26 @@ public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
7070
/**
7171
* Make sure user didn't mangle the id.
7272
*/
73-
public void checkId(Object object, EntityPersister persister, Object id, Status status, SessionImplementor session)
73+
public void checkId(Object object, EntityPersister persister, EntityEntry entry, SessionImplementor session)
7474
throws HibernateException {
75-
76-
if ( id instanceof DelayedPostInsertIdentifier ) {
77-
// this is a situation where the entity id is assigned by a post-insert generator
78-
// and was saved outside the transaction forcing it to be delayed
79-
return;
80-
}
81-
82-
final Object oid = persister.getIdentifier( object, session );
83-
if ( id == null ) {
84-
throw new AssertionFailure( "null id in " + persister.getEntityName()
85-
+ " entry (don't flush the Session after an exception occurs)" );
86-
}
87-
// Small optimisation: always try to avoid getIdentifierType().isEqual(..) when possible.
88-
// (However it's not safe to invoke the equals() method as it might trigger side effects.)
89-
else if ( id != oid
90-
&& !status.isDeletedOrGone()
91-
&& !persister.getIdentifierType().isEqual( id, oid, session.getFactory() ) ) {
92-
throw new HibernateException( "identifier of an instance of " + persister.getEntityName()
93-
+ " was altered from " + oid + " to " + id );
75+
final Object entryId = entry.getId();
76+
if ( entryId == null ) {
77+
throw new AssertionFailure( "Entry for instance of '" + persister.getEntityName()
78+
+ "' has a null identifier (this can happen if the session is flushed after an exception occurs)" );
79+
}
80+
if ( !(entryId instanceof DelayedPostInsertIdentifier) ) {
81+
final Object currentId = persister.getIdentifier( object, session );
82+
// Small optimisation: always try to avoid getIdentifierType().isEqual(..) when possible.
83+
// (However it's not safe to invoke the equals() method as it might trigger side effects.)
84+
if ( entryId != currentId
85+
&& !entry.getStatus().isDeletedOrGone()
86+
&& !persister.getIdentifierType().isEqual( entryId, currentId, session.getFactory() ) ) {
87+
throw new HibernateException( "Identifier of an instance of '" + persister.getEntityName()
88+
+ "' was altered from " + entryId + " to " + currentId );
89+
}
9490
}
91+
// else this is a situation where the entity id is assigned by a post-insert
92+
// generator and was saved outside the transaction, forcing it to be delayed
9593
}
9694

9795
private void checkNaturalId(
@@ -174,7 +172,7 @@ private Object[] getValues(Object entity, EntityEntry entry, boolean mightBeDirt
174172
}
175173
else {
176174
final EntityPersister persister = entry.getPersister();
177-
checkId( entity, persister, entry.getId(), entry.getStatus(), session );
175+
checkId( entity, persister, entry, session );
178176
// grab its current state
179177
final Object[] values = persister.getValues( entity );
180178
checkNaturalId( persister, entity, entry, values, loadedState, session );

0 commit comments

Comments
 (0)