9
9
import org .hibernate .CacheMode ;
10
10
import org .hibernate .HibernateException ;
11
11
import org .hibernate .LockMode ;
12
- import org .hibernate .NonUniqueObjectException ;
12
+ import org .hibernate .StaleObjectStateException ;
13
13
import org .hibernate .TransientObjectException ;
14
14
import org .hibernate .action .internal .CollectionRemoveAction ;
15
15
import org .hibernate .action .internal .EntityDeleteAction ;
22
22
import org .hibernate .engine .internal .ForeignKeys ;
23
23
import org .hibernate .engine .internal .Nullability ;
24
24
import org .hibernate .engine .internal .Nullability .NullabilityCheckType ;
25
- import org .hibernate .engine .spi .ActionQueue ;
26
25
import org .hibernate .engine .spi .CascadingActions ;
27
26
import org .hibernate .engine .spi .EntityEntry ;
28
27
import org .hibernate .engine .spi .EntityKey ;
39
38
import org .hibernate .jpa .event .spi .CallbackRegistry ;
40
39
import org .hibernate .jpa .event .spi .CallbackRegistryConsumer ;
41
40
import org .hibernate .jpa .event .spi .CallbackType ;
42
- import org .hibernate .metamodel .spi .MappingMetamodelImplementor ;
43
41
import org .hibernate .persister .collection .CollectionPersister ;
44
42
import org .hibernate .persister .entity .EntityPersister ;
45
43
import org .hibernate .pretty .MessageHelper ;
@@ -129,17 +127,16 @@ && canBeDeletedWithoutLoading( source, persister ) ) {
129
127
}
130
128
131
129
private static void deleteOwnedCollections (Type type , Object key , EventSource session ) {
132
- final MappingMetamodelImplementor mappingMetamodel = session .getFactory ().getMappingMetamodel ();
133
- final ActionQueue actionQueue = session .getActionQueue ();
134
- if ( type instanceof CollectionType ) {
135
- final String role = ( (CollectionType ) type ).getRole ();
136
- final CollectionPersister persister = mappingMetamodel .getCollectionDescriptor (role );
130
+ if ( type instanceof CollectionType collectionType ) {
131
+ final CollectionPersister persister =
132
+ session .getFactory ().getMappingMetamodel ()
133
+ .getCollectionDescriptor ( collectionType .getRole () );
137
134
if ( !persister .isInverse () && !skipRemoval ( session , persister , key ) ) {
138
- actionQueue .addAction ( new CollectionRemoveAction ( persister , key , session ) );
135
+ session . getActionQueue () .addAction ( new CollectionRemoveAction ( persister , key , session ) );
139
136
}
140
137
}
141
- else if ( type instanceof ComponentType ) {
142
- final Type [] subtypes = ( ( ComponentType ) type ) .getSubtypes ();
138
+ else if ( type instanceof ComponentType componentType ) {
139
+ final Type [] subtypes = componentType .getSubtypes ();
143
140
for ( Type subtype : subtypes ) {
144
141
deleteOwnedCollections ( subtype , key , session );
145
142
}
@@ -170,14 +167,14 @@ private void deleteUnmanagedInstance(DeleteEvent event, DeleteContext transientE
170
167
}
171
168
}
172
169
173
- private void deleteDetachedEntity (DeleteEvent event , DeleteContext transientEntities , Object entity , EntityPersister persister , EventSource source ) {
170
+ private void deleteDetachedEntity (
171
+ DeleteEvent event , DeleteContext transientEntities , Object entity , EntityPersister persister , EventSource source ) {
174
172
final Object id = persister .getIdentifier ( entity , source );
175
173
if ( id == null ) {
176
174
throw new TransientObjectException ( "Cannot delete instance of entity '"
177
175
+ persister .getEntityName () + "' because it has a null identifier" );
178
176
}
179
177
180
- final PersistenceContext persistenceContext = source .getPersistenceContextInternal ();
181
178
final EntityKey key = source .generateEntityKey ( id , persister );
182
179
final Object version = persister .getVersion (entity );
183
180
@@ -186,6 +183,7 @@ private void deleteDetachedEntity(DeleteEvent event, DeleteContext transientEnti
186
183
187
184
new OnUpdateVisitor ( source , id , entity ).process ( entity , persister );
188
185
186
+ final PersistenceContext persistenceContext = source .getPersistenceContextInternal ();
189
187
final EntityEntry entityEntry = persistenceContext .addEntity (
190
188
entity ,
191
189
persister .isMutable () ? Status .MANAGED : Status .READ_ONLY ,
@@ -218,7 +216,8 @@ private static void flushAndEvictExistingEntity(
218
216
source .evict ( existingEntity );
219
217
}
220
218
else {
221
- throw new NonUniqueObjectException ( key .getIdentifier (), key .getEntityName () );
219
+ throw new StaleObjectStateException ( key .getEntityName (), key .getIdentifier (),
220
+ "Persistence context contains a more recent version of the given entity" );
222
221
}
223
222
}
224
223
}
@@ -441,7 +440,7 @@ private Object[] createDeletedState(
441
440
final Type [] types = persister .getPropertyTypes ();
442
441
final Object [] deletedState = new Object [types .length ];
443
442
if ( !persister .hasCollections () || !persister .hasUninitializedLazyProperties ( parent ) ) {
444
- boolean [] copyability = new boolean [types .length ];
443
+ final boolean [] copyability = new boolean [types .length ];
445
444
java .util .Arrays .fill ( copyability , true );
446
445
TypeHelper .deepCopy ( currentState , types , copyability , deletedState , eventSource );
447
446
return deletedState ;
@@ -450,10 +449,11 @@ private Object[] createDeletedState(
450
449
final String [] propertyNames = persister .getPropertyNames ();
451
450
final BytecodeEnhancementMetadata enhancementMetadata = persister .getBytecodeEnhancementMetadata ();
452
451
for ( int i = 0 ; i < types .length ; i ++) {
453
- if ( types [i ] instanceof CollectionType && !enhancementMetadata .isAttributeLoaded ( parent , propertyNames [i ] ) ) {
454
- final CollectionType collectionType = (CollectionType ) types [i ];
455
- final CollectionPersister collectionDescriptor = persister .getFactory ().getMappingMetamodel ()
456
- .getCollectionDescriptor ( collectionType .getRole () );
452
+ if ( types [i ] instanceof CollectionType collectionType
453
+ && !enhancementMetadata .isAttributeLoaded ( parent , propertyNames [i ] ) ) {
454
+ final CollectionPersister collectionDescriptor =
455
+ persister .getFactory ().getMappingMetamodel ()
456
+ .getCollectionDescriptor ( collectionType .getRole () );
457
457
if ( collectionDescriptor .needsRemove () || collectionDescriptor .hasCache () ) {
458
458
final Object keyOfOwner = collectionType .getKeyOfOwner ( parent , eventSource .getSession () );
459
459
// This will make sure that a CollectionEntry exists
@@ -491,7 +491,7 @@ protected void cascadeBeforeDelete(
491
491
Object entity ,
492
492
DeleteContext transientEntities ) throws HibernateException {
493
493
494
- CacheMode cacheMode = session .getCacheMode ();
494
+ final CacheMode cacheMode = session .getCacheMode ();
495
495
session .setCacheMode ( CacheMode .GET );
496
496
final PersistenceContext persistenceContext = session .getPersistenceContextInternal ();
497
497
persistenceContext .incrementCascadeLevel ();
@@ -518,7 +518,7 @@ protected void cascadeAfterDelete(
518
518
Object entity ,
519
519
DeleteContext transientEntities ) throws HibernateException {
520
520
521
- CacheMode cacheMode = session .getCacheMode ();
521
+ final CacheMode cacheMode = session .getCacheMode ();
522
522
session .setCacheMode ( CacheMode .GET );
523
523
final PersistenceContext persistenceContext = session .getPersistenceContextInternal ();
524
524
persistenceContext .incrementCascadeLevel ();
0 commit comments