[hibernate-issues] [Hibernate-JIRA] Created: (HHH-2339) merge instumented class fails

Alexey Romanchuk (JIRA) noreply at atlassian.com
Thu Jan 4 01:36:44 EST 2007


merge instumented class fails
-----------------------------

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

  Components: core  
    Versions: 3.2.1, 3.2.0.ga    
 Environment: Hibernate 3.2.1 (tested with 3.2.0 too)
Postgresql 8.1.4
    Reporter: Alexey Romanchuk
    Priority: Blocker


When we try to merge instrumented detached entity with lazy no-proxy many-to-one association we have org.hibernate.LazyInitializationException.
It occurs because cascade try to process all associations in Cascade class, but object disconected from session and can not obtaion lazy property.
If classes are not instrumented all works ok.

Why merge action does not have overrided performOnLazyProperty mathod to prevent fetching lazy properties?

Here it is small example that illustates problem.
===MAPPING===
<hibernate-mapping>
  <class name="Client" table="test_client">
    <id name="id" column="id" type="long">
      <generator class="sequence">
        <param name="sequence">test_seq</param>
      </generator>
    </id>
    <property name="name" column="name"/>
    <many-to-one name="info" class="LoginInfo" lazy="no-proxy" column="info_id" cascade="merge,evict"/>
  </class>
  
  <class name="LoginInfo" table="test_login_info">
    <id name="id" column="id" type="long">
      <generator class="sequence">
        <param name="sequence">test_seq</param>
      </generator>
    </id>
    <property name="login" column="login"/>
    <property name="pass" column="pass"/>
  </class>
</hibernate-mapping>

===JAVA===

===DOMAIN===
public class Client
{
  private long id;
  
  private String name;
  
  private LoginInfo info;
  
  //getters and setters
}

public class LoginInfo
{
  private long id;
  
  private String login;
  
  private String pass;
 
  //getters and setters
}


===USAGE===
public class Main
{
  public static void main( String[] args )
  {
    Session s1 = sf.openSession();
    s1.beginTransaction();
    Client c = ( Client ) s1.get( Client.class, 2l );
    s1.flush();
    s1.getTransaction().commit();
    s1.close();
    
    Session s2 = sf.openSession();
    s2.beginTransaction();
    c =  ( Client ) s2.merge( c );
    s2.flush();
    s2.getTransaction().commit();
    s2.close();
  }
}

==STACKTRACE===
org.hibernate.LazyInitializationException: session is not connected
	at org.hibernate.intercept.AbstractFieldInterceptor.intercept(AbstractFieldInterceptor.java:67)
	at org.hibernate.intercept.cglib.FieldInterceptorImpl.readObject(FieldInterceptorImpl.java:75)
	at Client.$cglib_read_info(Client.java)
	at Client.getInfo(Client.java:12)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValue(AbstractEntityTuplizer.java:277)
	at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:3529)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
	at org.hibernate.event.def.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:407)
	at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:266)
	at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120)
	at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53)
	at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677)
	at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661)
	at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665)
	at Main.main(Main.java:56)


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