Skip to content

Commit 716e954

Browse files
barreirosebersole
authored andcommitted
HHH-9985 - bytecode enhancer - fix merge use case for composites
1 parent f759c15 commit 716e954

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ protected void copyValues(
415415
final Object[] copiedValues = TypeHelper.replace(
416416
persister.getPropertyValues( entity ),
417417
persister.getPropertyValues( target ),
418+
persister.getPropertyNames(),
418419
persister.getPropertyTypes(),
419420
source,
420421
target,
@@ -452,6 +453,7 @@ protected void copyValues(
452453
copiedValues = TypeHelper.replace(
453454
persister.getPropertyValues( entity ),
454455
persister.getPropertyValues( target ),
456+
persister.getPropertyNames(),
455457
persister.getPropertyTypes(),
456458
source,
457459
target,

hibernate-core/src/main/java/org/hibernate/type/ComponentType.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,9 +524,10 @@ public Object replace(
524524
Object[] values = TypeHelper.replace(
525525
getPropertyValues( original, entityMode ),
526526
getPropertyValues( result, entityMode ),
527+
propertyNames,
527528
propertyTypes,
528529
session,
529-
owner,
530+
result,
530531
copyCache
531532
);
532533

@@ -556,9 +557,10 @@ public Object replace(
556557
Object[] values = TypeHelper.replace(
557558
getPropertyValues( original, entityMode ),
558559
getPropertyValues( result, entityMode ),
560+
propertyNames,
559561
propertyTypes,
560562
session,
561-
owner,
563+
result,
562564
copyCache,
563565
foreignKeyDirection
564566
);

hibernate-core/src/main/java/org/hibernate/type/TypeHelper.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.util.Map;
1111

1212
import org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer;
13+
import org.hibernate.engine.spi.CompositeOwner;
14+
import org.hibernate.engine.spi.CompositeTracker;
1315
import org.hibernate.engine.spi.SessionImplementor;
1416
import org.hibernate.property.access.internal.PropertyAccessStrategyBackRefImpl;
1517
import org.hibernate.tuple.NonIdentifierAttribute;
@@ -147,6 +149,7 @@ else if ( row[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY || row[i] == Prop
147149
public static Object[] replace(
148150
final Object[] original,
149151
final Object[] target,
152+
final String[] names,
150153
final Type[] types,
151154
final SessionImplementor session,
152155
final Object owner,
@@ -176,6 +179,11 @@ else if ( target[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY ) {
176179
else {
177180
copied[i] = types[i].replace( original[i], target[i], session, owner, copyCache );
178181
}
182+
183+
// for bytecode enhanced entities, set the composite tracking structure
184+
if ( copied[i] instanceof CompositeTracker && owner instanceof CompositeOwner ) {
185+
( (CompositeTracker) copied[i] ).$$_hibernate_setOwner( names[i], (CompositeOwner) owner );
186+
}
179187
}
180188
return copied;
181189
}
@@ -196,6 +204,7 @@ else if ( target[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY ) {
196204
public static Object[] replace(
197205
final Object[] original,
198206
final Object[] target,
207+
final String[] names,
199208
final Type[] types,
200209
final SessionImplementor session,
201210
final Object owner,
@@ -204,12 +213,17 @@ public static Object[] replace(
204213
Object[] copied = new Object[original.length];
205214
for ( int i = 0; i < types.length; i++ ) {
206215
if ( original[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY
207-
|| original[i] == PropertyAccessStrategyBackRefImpl.UNKNOWN ) {
216+
|| original[i] == PropertyAccessStrategyBackRefImpl.UNKNOWN ) {
208217
copied[i] = target[i];
209218
}
210219
else {
211220
copied[i] = types[i].replace( original[i], target[i], session, owner, copyCache, foreignKeyDirection );
212221
}
222+
223+
// for bytecode enhanced entities, set the composite tracking structure
224+
if ( copied[i] instanceof CompositeTracker && owner instanceof CompositeOwner ) {
225+
( (CompositeTracker) copied[i] ).$$_hibernate_setOwner( names[i], (CompositeOwner) owner );
226+
}
213227
}
214228
return copied;
215229
}

0 commit comments

Comments
 (0)