HIbernate加载深度为2的关系

时间:2012-02-03 02:33:42

标签: java xml eclipse hibernate mapping

我有3个班 Class1有一个List,其元素为class2 这是通过连接表映射的(不能用外键映射,因为键不是唯一的)!

Class2有一个class3的外键 Class3不会从这种关系中保存任何东西。

整件事看起来像这样:

  Class1             Class1-2 jointable          Class2
+-----------+   +-----------+-----------+   +-----------+-----------+
| Class1_ID |   | Class1_ID | Class2_ID |   | Class2_ID | Class3_ID |
+-----------+   +-----------+-----------+   +-----------+-----------+
| 1         |   | 1         | 3         |   | 3         | 10        |
| 2         |   | 2         | 7         |   | 7         | 3         |
| ...       |   | ...       | ...       |   | ...       | ...       |
+-----------+   +-----------+-----------+   +-----------+-----------+

 Class3
+-----------+
| Class3_ID |
+-----------+
| 10        |
| 3         |
| ...       |
+-----------+

映射看起来像这样:

Class1: 
List<Class2> class2;

<bag name="class2" cascade="all" table="Class1_Class2" lazy="false" access="field">
     <key column="Class1_ID" />
        <many-to-many class="Class2" column="Class2_ID"/>

Class2: 
Class3 class3

<many-to-one name="class3" class="Class3" column="Class3_ID" fetch="join" unique="false"/>

因此,当我使用session.load(Class1.class,id)加载class1的元素时,我得到了该对象。 BUT!
我可以访问class1.class2(元素列表),但是当我尝试访问class1.class2.class3时,它给出了一个例外,即由于没有会话而无法执行延迟加载。
由于我的数据结构,此时我无法打开会话 我需要加载一个数据库访问权限。

所以现在我的问题是:我可以更改一次性加载所有内容的映射吗?如果我不能如何在1个会话中加载所有内容并返回类型为class1的Object,我可以访问class1.class2.class3? 感谢

1 个答案:

答案 0 :(得分:0)

我不熟悉XML配置(语法),但是你不能像Class2Class3之间的关系一样急切地定义Class1Class2之间的关系。 lazy=falsefetch="join")? class1.getClass2().getClass3() // Slightly different in your case because of many-to-many 应该自动设置此值,但显然不会以这种方式执行。

(我不会告诉你只是在会话中触摸对象的hack会加载它(如unique),因为那将是一个黑客攻击。)

  

这是通过连接表映射的(不能用外键映射,因为键不是唯一的)!

您可以通过Hibernate在键列上设置{{1}}约束。然后甚至可以用一个语句和连接选择所有内容(自动应该是急切的)。