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