[hibernate-issues] [Hibernate-JIRA] Created: (HHH-6629) the argument of merge() got corrupted

Vladimir Tsichevski (JIRA) noreply at atlassian.com
Thu Sep 1 11:43:02 EDT 2011


the argument of merge() got corrupted
-------------------------------------

                 Key: HHH-6629
                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-6629
             Project: Hibernate Core
          Issue Type: Bug
          Components: core
    Affects Versions: 3.6.7, 3.6.3
         Environment: MySQL, Oracle
            Reporter: Vladimir Tsichevski


The object passed to the EntityManager.merge() method sometimes got corrupted while the merge() is executed. This happens if

1. The entity has a @OneToMany field.
2. The @OneToMany field type is the same as or derivative of the owner type
3. The entity has a composite @Id

As the result, the owner object receives @Id fields from one of its @OneToMany field collection members.

This is due to that the parent object (owner) is sometimes used as the target template when children are merged in org.hibernate.type.ComponentType.replace() method (lines 460-462 in 3.6.7):

		final Object result = target == null
				? instantiate( owner, session )
				: target;

which calls the org.hibernate.type.EmbeddedComponentType.instantiate method (lines 51-61):

	public Object instantiate(Object parent, SessionImplementor session)
	throws HibernateException {
		final boolean useParent = parent!=null &&
		                          //TODO: Yuck! This is not quite good enough, it's a quick
		                          //hack around the problem of having a to-one association
		                          //that refers to an embedded component:
		                          super.getReturnedClass().isInstance(parent);

		return useParent ? parent : super.instantiate(parent, session);
	}

as you may see, if useParent is true, the parent object (owner) is used as the template to update children!

IMHO this must either be fixed or documentations shall say valuable objects must never be passed to merge()

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list