[hibernate-issues] [Hibernate-JIRA] Created: (HHH-2027) ComponentType.replace reverts interceptor's changes to null component

Josh Moore (JIRA) noreply at atlassian.com
Fri Aug 25 08:54:24 EDT 2006


ComponentType.replace reverts interceptor's changes to null component
---------------------------------------------------------------------

         Key: HHH-2027
         URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2027
     Project: Hibernate3
        Type: Bug

  Components: core  
    Versions: 3.2.0.cr2    
 Environment: Hibernate r10347
java version "1.5.0_07"

    Reporter: Josh Moore
 Attachments: nullcomponentinterceptor.zip

When an interceptor sets a previously null component-typed property of an entity to a non-null value, ComponentType.replace reverts the value to null due to the lines 422-425:

		if ( original == null ) {
			return null;
		}

This means it is not possible on Interceptor.onSave() to "fix" a null component even if true is returned. Excerpts from the attached zip file follow:

[MAPPING]

<class name="Image"  table="image" abstract="false" select-before-update="true">
   <id name="id" type="java.lang.Long" column="id"><generator class="native"/></id>
		
        <component name="details" class="Details">			
          <property name="perm1" not-null="true" 
              type="long" column="permissions"/> 
        </component>

	<property name="name" type="java.lang.String"  column="name" not-null="true" length="256"/>

</class>

[INTERCEPTOR]

public class DetailsInterceptor extends EmptyInterceptor {

	boolean onSaveCalled = false;	
	
	@Override
	public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
		state[0] = new Details();
		onSaveCalled = true;
		return true;
	}

}

[TEST]

		DetailsInterceptor pi = new DetailsInterceptor();
		
		Session s = openSession( pi );
		Transaction t = s.beginTransaction();
		Image i = new Image();
		i.setName("compincomp");

		// the interceptor does the equivalent of:
		//
		//		i.setDetails( new Details() ); 
		//
		// which when uncommented makes this test pass.
		//
		// without that line, the null details gets copied back to the result
		// on merge causing the following on commit:
		/*
org.hibernate.PropertyValueException: not-null property references a null or transient value: org.hibernate.test.compincomp.Image.details
	at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:263)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:121)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
		*/

		s.merge(i);
		assertTrue( pi.onSaveCalled );
		t.commit();
		s.close();

-- 
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