[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-2339) merge instumented class fails
Mahesh Shinde (JIRA)
noreply at atlassian.com
Fri Jun 25 02:21:11 EDT 2010
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2339?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=37579#action_37579 ]
Mahesh Shinde commented on HHH-2339:
------------------------------------
This problem could be resolved by making new instance and copy required filed information into the new instance,
> merge instumented class fails
> -----------------------------
>
> Key: HHH-2339
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2339
> Project: Hibernate Core
> Issue Type: Bug
> Components: core
> Affects Versions: 3.2.0.ga, 3.2.1
> 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