Skip to content

Commit 2af19a6

Browse files
committed
HHH-15258 Orphan removal for OneToMany relations is broken when used with GenerationType.IDENTITY
1 parent 1a94bcc commit 2af19a6

File tree

5 files changed

+86
-103
lines changed

5 files changed

+86
-103
lines changed

hibernate-core/src/main/java/org/hibernate/action/internal/AbstractEntityInsertAction.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,22 @@
77
package org.hibernate.action.internal;
88

99
import org.hibernate.LockMode;
10+
import org.hibernate.collection.spi.PersistentCollection;
1011
import org.hibernate.engine.internal.ForeignKeys;
1112
import org.hibernate.engine.internal.NonNullableTransientDependencies;
1213
import org.hibernate.engine.internal.Nullability;
1314
import org.hibernate.engine.internal.Versioning;
1415
import org.hibernate.engine.spi.CachedNaturalIdValueSource;
16+
import org.hibernate.engine.spi.CollectionKey;
1517
import org.hibernate.engine.spi.EntityEntry;
1618
import org.hibernate.engine.spi.EntityKey;
19+
import org.hibernate.engine.spi.PersistenceContext;
1720
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1821
import org.hibernate.engine.spi.Status;
1922
import org.hibernate.metamodel.mapping.NaturalIdMapping;
23+
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
24+
import org.hibernate.persister.collection.CollectionPersister;
25+
import org.hibernate.persister.entity.AbstractEntityPersister;
2026
import org.hibernate.persister.entity.EntityPersister;
2127

2228
/**
@@ -132,6 +138,27 @@ public final void makeEntityManaged() {
132138
getPersister(),
133139
isVersionIncrementDisabled
134140
);
141+
if ( isEarlyInsert() ) {
142+
final SharedSessionContractImplementor session = getSession();
143+
final PersistenceContext persistenceContext = session.getPersistenceContextInternal();
144+
Object[] objects = getState();
145+
for ( int i = 0; i < objects.length; i++ ) {
146+
if ( objects[i] instanceof PersistentCollection<?> ) {
147+
final PersistentCollection<?> persistentCollection = (PersistentCollection<?>) objects[i];
148+
final CollectionPersister collectionPersister = ( (PluralAttributeMapping) getPersister().getAttributeMapping( i ) ).getCollectionDescriptor();
149+
final CollectionKey collectionKey = new CollectionKey(
150+
collectionPersister,
151+
( (AbstractEntityPersister) getPersister() ).getCollectionKey(
152+
collectionPersister,
153+
getInstance(),
154+
persistenceContext.getEntry( getInstance() ),
155+
getSession()
156+
)
157+
);
158+
persistenceContext.addCollectionByKey( collectionKey, persistentCollection );
159+
}
160+
}
161+
}
135162
}
136163

137164
/**

hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1614,7 +1614,7 @@ public Object initializeLazyProperty(String fieldName, Object entity, SharedSess
16141614

16151615
}
16161616

1617-
protected Object getCollectionKey(
1617+
public Object getCollectionKey(
16181618
CollectionPersister persister,
16191619
Object owner,
16201620
EntityEntry ownerEntry,

hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/AbstractCollectionInitializer.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,22 @@
66
*/
77
package org.hibernate.sql.results.graph.collection.internal;
88

9+
import org.hibernate.collection.spi.CollectionSemantics;
910
import org.hibernate.collection.spi.PersistentCollection;
1011
import org.hibernate.engine.spi.CollectionKey;
12+
import org.hibernate.engine.spi.PersistenceContext;
13+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1114
import org.hibernate.internal.log.LoggingHelper;
15+
import org.hibernate.metamodel.CollectionClassification;
1216
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
17+
import org.hibernate.persister.collection.CollectionPersister;
1318
import org.hibernate.persister.entity.AbstractEntityPersister;
1419
import org.hibernate.spi.NavigablePath;
1520
import org.hibernate.sql.results.graph.DomainResultAssembler;
1621
import org.hibernate.sql.results.graph.FetchParentAccess;
1722
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
1823
import org.hibernate.sql.results.graph.collection.CollectionLoadingLogger;
24+
import org.hibernate.sql.results.graph.collection.LoadingCollectionEntry;
1925
import org.hibernate.sql.results.graph.entity.EntityInitializer;
2026
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
2127

@@ -85,6 +91,56 @@ public void resolveKey(RowProcessingState rowProcessingState) {
8591
}
8692
}
8793

94+
protected void resolveInstance(RowProcessingState rowProcessingState, boolean isEager) {
95+
if ( collectionKey != null ) {
96+
final SharedSessionContractImplementor session = rowProcessingState.getSession();
97+
final PersistenceContext persistenceContext = session.getPersistenceContext();
98+
99+
final LoadingCollectionEntry loadingEntry = persistenceContext.getLoadContexts()
100+
.findLoadingCollectionEntry( collectionKey );
101+
102+
if ( loadingEntry != null ) {
103+
collectionInstance = loadingEntry.getCollectionInstance();
104+
return;
105+
}
106+
107+
final PersistentCollection<?> existing = persistenceContext.getCollection( collectionKey );
108+
109+
if ( existing != null ) {
110+
collectionInstance = existing;
111+
return;
112+
}
113+
114+
final CollectionPersister collectionDescriptor = collectionAttributeMapping.getCollectionDescriptor();
115+
final CollectionSemantics<?, ?> collectionSemantics = collectionDescriptor.getCollectionSemantics();
116+
final Object key = collectionKey.getKey();
117+
118+
collectionInstance = collectionSemantics.instantiateWrapper(
119+
key,
120+
collectionDescriptor,
121+
session
122+
);
123+
124+
parentAccess.registerResolutionListener(
125+
owner -> collectionInstance.setOwner( owner )
126+
);
127+
128+
persistenceContext.addUninitializedCollection(
129+
collectionDescriptor,
130+
collectionInstance,
131+
key
132+
);
133+
134+
if ( isEager ) {
135+
persistenceContext.addNonLazyCollection( collectionInstance );
136+
}
137+
138+
if ( collectionSemantics.getCollectionClassification() == CollectionClassification.ARRAY ) {
139+
session.getPersistenceContext().addCollectionHolder( collectionInstance );
140+
}
141+
}
142+
}
143+
88144
protected boolean isAttributeAssignableToConcreteDescriptor() {
89145
if ( parentAccess instanceof EntityInitializer ) {
90146
final AbstractEntityPersister concreteDescriptor = (AbstractEntityPersister) ( (EntityInitializer) parentAccess ).getConcreteDescriptor();

hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/DelayedCollectionInitializer.java

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,11 @@
66
*/
77
package org.hibernate.sql.results.graph.collection.internal;
88

9-
import org.hibernate.collection.spi.CollectionSemantics;
10-
import org.hibernate.collection.spi.PersistentCollection;
11-
import org.hibernate.engine.spi.PersistenceContext;
12-
import org.hibernate.engine.spi.SharedSessionContractImplementor;
139
import org.hibernate.internal.log.LoggingHelper;
14-
import org.hibernate.metamodel.CollectionClassification;
1510
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
16-
import org.hibernate.persister.collection.CollectionPersister;
1711
import org.hibernate.spi.NavigablePath;
1812
import org.hibernate.sql.results.graph.DomainResultAssembler;
1913
import org.hibernate.sql.results.graph.FetchParentAccess;
20-
import org.hibernate.sql.results.graph.collection.LoadingCollectionEntry;
2114
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
2215

2316
/**
@@ -35,49 +28,7 @@ public DelayedCollectionInitializer(
3528

3629
@Override
3730
public void resolveInstance(RowProcessingState rowProcessingState) {
38-
if ( collectionKey != null ) {
39-
final SharedSessionContractImplementor session = rowProcessingState.getSession();
40-
final PersistenceContext persistenceContext = session.getPersistenceContext();
41-
42-
final LoadingCollectionEntry loadingEntry = persistenceContext.getLoadContexts()
43-
.findLoadingCollectionEntry( collectionKey );
44-
45-
if ( loadingEntry != null ) {
46-
collectionInstance = loadingEntry.getCollectionInstance();
47-
return;
48-
}
49-
50-
final PersistentCollection<?> existing = persistenceContext.getCollection( collectionKey );
51-
52-
if ( existing != null ) {
53-
collectionInstance = existing;
54-
return;
55-
}
56-
57-
final CollectionPersister collectionDescriptor = collectionAttributeMapping.getCollectionDescriptor();
58-
final CollectionSemantics<?, ?> collectionSemantics = collectionDescriptor.getCollectionSemantics();
59-
final Object key = collectionKey.getKey();
60-
61-
collectionInstance = collectionSemantics.instantiateWrapper(
62-
key,
63-
collectionDescriptor,
64-
session
65-
);
66-
67-
parentAccess.registerResolutionListener(
68-
owner -> collectionInstance.setOwner( owner )
69-
);
70-
71-
persistenceContext.addUninitializedCollection(
72-
collectionDescriptor,
73-
collectionInstance,
74-
key
75-
);
76-
77-
if ( collectionSemantics.getCollectionClassification() == CollectionClassification.ARRAY ) {
78-
session.getPersistenceContext().addCollectionHolder( collectionInstance );
79-
}
80-
}
31+
resolveInstance( rowProcessingState, false );
8132
}
8233

8334
@Override

hibernate-core/src/main/java/org/hibernate/sql/results/graph/collection/internal/SelectEagerCollectionInitializer.java

Lines changed: 1 addition & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,11 @@
66
*/
77
package org.hibernate.sql.results.graph.collection.internal;
88

9-
import org.hibernate.collection.spi.CollectionSemantics;
10-
import org.hibernate.collection.spi.PersistentCollection;
11-
import org.hibernate.engine.spi.PersistenceContext;
12-
import org.hibernate.engine.spi.SharedSessionContractImplementor;
139
import org.hibernate.internal.log.LoggingHelper;
14-
import org.hibernate.metamodel.CollectionClassification;
1510
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
16-
import org.hibernate.persister.collection.CollectionPersister;
1711
import org.hibernate.spi.NavigablePath;
1812
import org.hibernate.sql.results.graph.DomainResultAssembler;
1913
import org.hibernate.sql.results.graph.FetchParentAccess;
20-
import org.hibernate.sql.results.graph.collection.LoadingCollectionEntry;
2114
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
2215

2316
/**
@@ -35,51 +28,7 @@ public SelectEagerCollectionInitializer(
3528

3629
@Override
3730
public void resolveInstance(RowProcessingState rowProcessingState) {
38-
if ( collectionKey != null ) {
39-
final SharedSessionContractImplementor session = rowProcessingState.getSession();
40-
final PersistenceContext persistenceContext = session.getPersistenceContext();
41-
42-
final LoadingCollectionEntry loadingEntry = persistenceContext.getLoadContexts()
43-
.findLoadingCollectionEntry( collectionKey );
44-
45-
if ( loadingEntry != null ) {
46-
collectionInstance = loadingEntry.getCollectionInstance();
47-
return;
48-
}
49-
50-
final PersistentCollection<?> existing = persistenceContext.getCollection( collectionKey );
51-
52-
if ( existing != null ) {
53-
collectionInstance = existing;
54-
return;
55-
}
56-
57-
final CollectionPersister collectionDescriptor = collectionAttributeMapping.getCollectionDescriptor();
58-
final CollectionSemantics<?, ?> collectionSemantics = collectionDescriptor.getCollectionSemantics();
59-
final Object key = collectionKey.getKey();
60-
61-
collectionInstance = collectionSemantics.instantiateWrapper(
62-
key,
63-
collectionDescriptor,
64-
session
65-
);
66-
67-
parentAccess.registerResolutionListener(
68-
owner -> collectionInstance.setOwner( owner )
69-
);
70-
71-
persistenceContext.addUninitializedCollection(
72-
collectionDescriptor,
73-
collectionInstance,
74-
key
75-
);
76-
77-
persistenceContext.addNonLazyCollection( collectionInstance );
78-
79-
if ( collectionSemantics.getCollectionClassification() == CollectionClassification.ARRAY ) {
80-
session.getPersistenceContext().addCollectionHolder( collectionInstance );
81-
}
82-
}
31+
resolveInstance( rowProcessingState, true );
8332
}
8433

8534
@Override

0 commit comments

Comments
 (0)