@@ -70,28 +70,26 @@ public void injectCallbackRegistry(CallbackRegistry callbackRegistry) {
70
70
/**
71
71
* Make sure user didn't mangle the id.
72
72
*/
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 )
74
74
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
+ }
94
90
}
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
95
93
}
96
94
97
95
private void checkNaturalId (
@@ -174,7 +172,7 @@ private Object[] getValues(Object entity, EntityEntry entry, boolean mightBeDirt
174
172
}
175
173
else {
176
174
final EntityPersister persister = entry .getPersister ();
177
- checkId ( entity , persister , entry . getId (), entry . getStatus () , session );
175
+ checkId ( entity , persister , entry , session );
178
176
// grab its current state
179
177
final Object [] values = persister .getValues ( entity );
180
178
checkNaturalId ( persister , entity , entry , values , loadedState , session );
0 commit comments