我有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? 感谢
答案 0 :(得分:0)
我不熟悉XML配置(语法),但是你不能像Class2
和Class3
之间的关系一样急切地定义Class1
和Class2
之间的关系。 lazy=false
(fetch="join"
)? class1.getClass2().getClass3() // Slightly different in your case because of many-to-many
应该自动设置此值,但显然不会以这种方式执行。
(我不会告诉你只是在会话中触摸对象的hack会加载它(如unique
),因为那将是一个黑客攻击。)
这是通过连接表映射的(不能用外键映射,因为键不是唯一的)!
您可以通过Hibernate在键列上设置{{1}}约束。然后甚至可以用一个语句和连接选择所有内容(自动应该是急切的)。