[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-6238?page=c...
]
Yury Mishchenko commented on HHH-6238:
--------------------------------------
Here is the fixed version of the method:
{noformat}
public static Object[] replaceAssociations(
final Object[] original,
final Object[] target,
final Type[] types,
final SessionImplementor session,
final Object owner,
final Map copyCache,
final ForeignKeyDirection foreignKeyDirection) {
Object[] copied = new Object[original.length];
for ( int i = 0; i < types.length; i++ ) {
if ( original[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY
|| original[i] == BackrefPropertyAccessor.UNKNOWN ) {
copied[i] = target[i];
}
else if ( types[i].isComponentType() ) {
// need to extract the component values and check for subtype replacements...
CompositeType componentType = ( CompositeType ) types[i];
Type[] subtypes = componentType.getSubtypes();
Object[] origComponentValues = original[i] == null ? new Object[subtypes.length] :
componentType.getPropertyValues( original[i], session );
Object[] targetComponentValues = target[i] == null ? new Object[subtypes.length] :
componentType.getPropertyValues( target[i], session );
// PROBLEM: solved!!!
Object[] merged = replaceAssociations( origComponentValues, targetComponentValues,
subtypes, session, null, copyCache, foreignKeyDirection );
componentType.setPropertyValues(target[i], merged,
session.getEntityMode());
copied[i] = target[i];
}
else if ( !types[i].isAssociationType() ) {
copied[i] = target[i];
}
else {
copied[i] = types[i].replace( original[i], target[i], session, owner, copyCache,
foreignKeyDirection );
}
}
return copied;
}
{noformat}
Issue in the TypeHelper.replaceAssociations(): component properties
are not processed properly
----------------------------------------------------------------------------------------------
Key: HHH-6238
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-6238
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 3.6.5
Reporter: Yury Mishchenko
Original Estimate: 2h
Remaining Estimate: 2h
There seems to be an issue in the org.hibernate.type.TypeHelper.replaceAssociations()
method. You can see in the source (see below) that it does not do replacement properly for
components properties.
It does execute replacement for component properties but it does not apply results to the
target. Thus it returns the target unchanged. I found this issue when executing a merge on
an entity having a component property with an embedded set. The embedded set is never
persisted. I think the fix is very simple: one needs to use results of the replacement and
update the target properties. Is it feasible for the 3.6.5?
{code}
public static Object[] replaceAssociations(
final Object[] original,
final Object[] target,
final Type[] types,
final SessionImplementor session,
final Object owner,
final Map copyCache,
final ForeignKeyDirection foreignKeyDirection) {
Object[] copied = new Object[original.length];
for ( int i = 0; i < types.length; i++ ) {
if ( original[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY
|| original[i] == BackrefPropertyAccessor.UNKNOWN ) {
copied[i] = target[i];
}
else if ( types[i].isComponentType() ) {
// need to extract the component values and check for subtype replacements...
CompositeType componentType = ( CompositeType ) types[i];
Type[] subtypes = componentType.getSubtypes();
Object[] origComponentValues = original[i] == null ? new Object[subtypes.length] :
componentType.getPropertyValues( original[i], session );
Object[] targetComponentValues = target[i] == null ? new Object[subtypes.length] :
componentType.getPropertyValues( target[i], session );
// PROBLEM: Results of the replace is not used!!! Instead they should be used for
updating target[i] properties!!!
replaceAssociations( origComponentValues, targetComponentValues, subtypes, session,
null, copyCache, foreignKeyDirection );
copied[i] = target[i];
}
else if ( !types[i].isAssociationType() ) {
copied[i] = target[i];
}
else {
copied[i] = types[i].replace( original[i], target[i], session, owner, copyCache,
foreignKeyDirection );
}
}
return copied;
}
{code}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira