HHH-9985 - bytecode enhancer - fix merge use case for composites
This commit is contained in:
parent
f759c152e2
commit
716e954f49
|
@ -415,6 +415,7 @@ public class DefaultMergeEventListener extends AbstractSaveEventListener impleme
|
||||||
final Object[] copiedValues = TypeHelper.replace(
|
final Object[] copiedValues = TypeHelper.replace(
|
||||||
persister.getPropertyValues( entity ),
|
persister.getPropertyValues( entity ),
|
||||||
persister.getPropertyValues( target ),
|
persister.getPropertyValues( target ),
|
||||||
|
persister.getPropertyNames(),
|
||||||
persister.getPropertyTypes(),
|
persister.getPropertyTypes(),
|
||||||
source,
|
source,
|
||||||
target,
|
target,
|
||||||
|
@ -452,6 +453,7 @@ public class DefaultMergeEventListener extends AbstractSaveEventListener impleme
|
||||||
copiedValues = TypeHelper.replace(
|
copiedValues = TypeHelper.replace(
|
||||||
persister.getPropertyValues( entity ),
|
persister.getPropertyValues( entity ),
|
||||||
persister.getPropertyValues( target ),
|
persister.getPropertyValues( target ),
|
||||||
|
persister.getPropertyNames(),
|
||||||
persister.getPropertyTypes(),
|
persister.getPropertyTypes(),
|
||||||
source,
|
source,
|
||||||
target,
|
target,
|
||||||
|
|
|
@ -524,9 +524,10 @@ public class ComponentType extends AbstractType implements CompositeType, Proced
|
||||||
Object[] values = TypeHelper.replace(
|
Object[] values = TypeHelper.replace(
|
||||||
getPropertyValues( original, entityMode ),
|
getPropertyValues( original, entityMode ),
|
||||||
getPropertyValues( result, entityMode ),
|
getPropertyValues( result, entityMode ),
|
||||||
|
propertyNames,
|
||||||
propertyTypes,
|
propertyTypes,
|
||||||
session,
|
session,
|
||||||
owner,
|
result,
|
||||||
copyCache
|
copyCache
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -556,9 +557,10 @@ public class ComponentType extends AbstractType implements CompositeType, Proced
|
||||||
Object[] values = TypeHelper.replace(
|
Object[] values = TypeHelper.replace(
|
||||||
getPropertyValues( original, entityMode ),
|
getPropertyValues( original, entityMode ),
|
||||||
getPropertyValues( result, entityMode ),
|
getPropertyValues( result, entityMode ),
|
||||||
|
propertyNames,
|
||||||
propertyTypes,
|
propertyTypes,
|
||||||
session,
|
session,
|
||||||
owner,
|
result,
|
||||||
copyCache,
|
copyCache,
|
||||||
foreignKeyDirection
|
foreignKeyDirection
|
||||||
);
|
);
|
||||||
|
|
|
@ -10,6 +10,8 @@ import java.io.Serializable;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer;
|
import org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer;
|
||||||
|
import org.hibernate.engine.spi.CompositeOwner;
|
||||||
|
import org.hibernate.engine.spi.CompositeTracker;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
import org.hibernate.property.access.internal.PropertyAccessStrategyBackRefImpl;
|
import org.hibernate.property.access.internal.PropertyAccessStrategyBackRefImpl;
|
||||||
import org.hibernate.tuple.NonIdentifierAttribute;
|
import org.hibernate.tuple.NonIdentifierAttribute;
|
||||||
|
@ -147,6 +149,7 @@ public class TypeHelper {
|
||||||
public static Object[] replace(
|
public static Object[] replace(
|
||||||
final Object[] original,
|
final Object[] original,
|
||||||
final Object[] target,
|
final Object[] target,
|
||||||
|
final String[] names,
|
||||||
final Type[] types,
|
final Type[] types,
|
||||||
final SessionImplementor session,
|
final SessionImplementor session,
|
||||||
final Object owner,
|
final Object owner,
|
||||||
|
@ -176,6 +179,11 @@ public class TypeHelper {
|
||||||
else {
|
else {
|
||||||
copied[i] = types[i].replace( original[i], target[i], session, owner, copyCache );
|
copied[i] = types[i].replace( original[i], target[i], session, owner, copyCache );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// for bytecode enhanced entities, set the composite tracking structure
|
||||||
|
if ( copied[i] instanceof CompositeTracker && owner instanceof CompositeOwner ) {
|
||||||
|
( (CompositeTracker) copied[i] ).$$_hibernate_setOwner( names[i], (CompositeOwner) owner );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return copied;
|
return copied;
|
||||||
}
|
}
|
||||||
|
@ -196,6 +204,7 @@ public class TypeHelper {
|
||||||
public static Object[] replace(
|
public static Object[] replace(
|
||||||
final Object[] original,
|
final Object[] original,
|
||||||
final Object[] target,
|
final Object[] target,
|
||||||
|
final String[] names,
|
||||||
final Type[] types,
|
final Type[] types,
|
||||||
final SessionImplementor session,
|
final SessionImplementor session,
|
||||||
final Object owner,
|
final Object owner,
|
||||||
|
@ -204,12 +213,17 @@ public class TypeHelper {
|
||||||
Object[] copied = new Object[original.length];
|
Object[] copied = new Object[original.length];
|
||||||
for ( int i = 0; i < types.length; i++ ) {
|
for ( int i = 0; i < types.length; i++ ) {
|
||||||
if ( original[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY
|
if ( original[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY
|
||||||
|| original[i] == PropertyAccessStrategyBackRefImpl.UNKNOWN ) {
|
|| original[i] == PropertyAccessStrategyBackRefImpl.UNKNOWN ) {
|
||||||
copied[i] = target[i];
|
copied[i] = target[i];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
copied[i] = types[i].replace( original[i], target[i], session, owner, copyCache, foreignKeyDirection );
|
copied[i] = types[i].replace( original[i], target[i], session, owner, copyCache, foreignKeyDirection );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// for bytecode enhanced entities, set the composite tracking structure
|
||||||
|
if ( copied[i] instanceof CompositeTracker && owner instanceof CompositeOwner ) {
|
||||||
|
( (CompositeTracker) copied[i] ).$$_hibernate_setOwner( names[i], (CompositeOwner) owner );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return copied;
|
return copied;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue