From: <leg...@at...> - 2003-09-15 14:28:54
|
Message: The following issue has been closed. Resolver: Gavin King Date: Mon, 15 Sep 2003 9:28 AM Thanks, this is fixed in CVS. --------------------------------------------------------------------- View the issue: http://opensource.atlassian.com/projects/hibernate/secure/ViewIssue.jspa?key=HB-335 Here is an overview of the issue: --------------------------------------------------------------------- Key: HB-335 Summary: Full object tree not loaded with many to many associations Type: Bug Status: Closed Priority: Major Resolution: FIXED Project: Hibernate2 Components: core Fix Fors: 2.1 beta 4 Versions: 2.1 beta 2 Assignee: Reporter: Huguette Created: Mon, 15 Sep 2003 8:43 AM Updated: Mon, 15 Sep 2003 9:28 AM Environment: Win2000 - MySQL Description: I've got 3 classes A, B and C and 2 many to many relations between A and B and between B and C. Both are not lazy. When I do following: open session load an instance of A close session iterate over A.getBs() iterate over B.getCs() an exception is thrown: net.sf.hibernate.LazyInitializationException: Failed to lazily initialize a collection - no Session when a try to access B.getCs() A look at the traces shows that hibernate did not generate the SQL query to load the C objects. CODE : ******************************************************************* package com.lge.test; import java.util.Iterator; import net.sf.hibernate.Session; import net.sf.hibernate.SessionFactory; import net.sf.hibernate.Transaction; import net.sf.hibernate.cfg.Configuration; public class TestManyToMany { private SessionFactory sessionFactory; public TestManyToMany() throws Exception { Configuration cfg = new Configuration(); cfg.addClass( M2MclassA.class); cfg.addClass( M2MclassB.class); cfg.addClass( M2MclassC.class); this.sessionFactory = cfg.buildSessionFactory(); } public void doTest1() throws Exception { Session session = this.sessionFactory.openSession(); M2MclassB objB = (M2MclassB)session.find("from com.lge.test.M2MclassB as b where b.name = 'objB'").get(0); session.close(); for (Iterator iter = objB.getChildren().iterator(); iter.hasNext();) { System.out.println( iter.next()); } System.out.println("Test 1 OK"); } public void doTest2() throws Exception { Session session = this.sessionFactory.openSession(); M2MclassA objA = (M2MclassA)session.find("from com.lge.test.M2MclassA as a where a.name = 'objA'").get(0); session.close(); for (Iterator iter = objA.getChildren().iterator(); iter.hasNext();) { M2MclassB child = (M2MclassB)iter.next(); System.out.println( "M2MclassB "+child); for (Iterator iterator = child.getChildren().iterator(); iterator.hasNext();) { System.out.println( " "+iterator.next()); } } System.out.println("Test 2 OK"); } public void init() throws Exception { Session session = this.sessionFactory.openSession(); Transaction t = session.beginTransaction(); M2MclassA objA = new M2MclassA( "objA"); M2MclassB objB = new M2MclassB( "objB"); M2MclassC c1 = new M2MclassC("c1"); M2MclassC c2 = new M2MclassC("c2"); objB.addChild( c1); objB.addChild( c2); objA.addChild(objB); session.save( c1); session.save( c2); session.save(objB); session.save(objA); session.flush(); t.commit(); session.close(); } /** * @param args command line arguments * @exception */ public static void main(String[] args) throws Exception { TestManyToMany test = new TestManyToMany(); test.init(); test.doTest1(); test.doTest2(); } } ***************************************************** package com.lge.test; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class M2MclassA implements Serializable { private Long id; private Set children = new HashSet(); private String name; public M2MclassA(){} public M2MclassA( String name){ setName(name);} public void setChildren( Set children) { this.children = children; } public Set getChildren() { return this.children; } public void addChild( M2MclassB child) { this.children.add( child); } public void removeChild( M2MclassB child) { this.children.remove(child); } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String toString() { return getName();} } ***************************************************** package com.lge.test; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class M2MclassB implements Serializable { private Long id; private Set children = new HashSet(); private String name; public M2MclassB(){} public M2MclassB( String name){ setName(name);} public void setChildren( Set children) { this.children = children; } public Set getChildren() { return this.children; } public void addChild( M2MclassC child) { this.children.add( child); } public void removeChild( M2MclassC child) { this.children.remove(child); } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String toString() { return getName();} } ******************************************************** package com.lge.test; import java.io.Serializable; public class M2MclassC implements Serializable { private Long id; private String name; public M2MclassC(){} public M2MclassC( String name){ setName( name);} public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String toString() { return getName();} } ********************************************************* <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="com.lge.test.M2MclassA" table="TABLE_A"> <id column="ID" name="id" unsaved-value="null"> <generator class="native"/> </id> <property column="NAME" length="10" name="name" not-null="true" type="java.lang.String"/> <set name="children" table="A2B" lazy="false"> <key column="parent_id" /> <many-to-many class="com.lge.test.M2MclassB" column="child_id" /> </set> </class> </hibernate-mapping> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="com.lge.test.M2MclassB" table="TABLE_B"> <id column="ID" name="id" unsaved-value="null"> <generator class="native"/> </id> <property column="NAME" length="10" name="name" not-null="true" type="java.lang.String"/> <set name="children" table="B2C" lazy="false"> <key column="parent_id" /> <many-to-many class="com.lge.test.M2MclassC" column="child_id" /> </set> </class> </hibernate-mapping> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="com.lge.test.M2MclassC" table="TABLE_C"> <id column="ID" name="id" unsaved-value="null"> <generator class="native"/> </id> <property column="NAME" length="10" name="name" not-null="true" type="java.lang.String"/> </class> </hibernate-mapping> --------------------------------------------------------------------- JIRA INFORMATION: 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 If you want more information on JIRA, or have a bug to report see: http://www.atlassian.com/software/jira |