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

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


     [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2339?page=all ]

Alexey Romanchuk updated HHH-2339:
----------------------------------

    Attachment: hhh2339.zip

Set of files to reproduce bug

> 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
>  Attachments: hhh2339.zip
>
>
> 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