[hibernate-issues] [Hibernate-JIRA] Created: (HHH-6238) Issue in the TypeHelper.replaceAssociations(): component properties are not processed properly

Yury Mishchenko (JIRA) noreply at atlassian.com
Thu May 19 16:21:24 EDT 2011


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


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.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list