单向1——N关联关系的持久化类发生了改变,持久化类里需要使用集合,因为1的一端需要访问N的一端,而N的一端降一级和的形式出现:它只是将前边的用于集合映射的<element.../>元素改为<one-to-many.../>
属性:
单向的1——N关联关系:
只需要在1的实体类一端增加Set属性的setter,getter;
无连接表的单向1——N:
eg:
<!-- 映射集合属性,集合元素是其他持久化实体
没有指定cascade属性 -->
<set name="addresses">
<!-- 指定关联的外键列 -->
<key column="personId"/>
<!-- 用以映射到关联类属性 -->
<one-to-many class="Address"/>
</set>
有连接表的单向一对多:
对于有连接表的1——N,不是使用哪个one-to-many 而是使用many-to-many 为了保证当前实体的是 1 的一端,因此要用unique=“true”
eg:
<!-- 映射集合属性,集合元素是其他持久化实体
指定连接表的表名-->
<set name="addresses" table="person_address">
<!-- 指定连接表中参照本表记录的外键列名 -->
<key column="person_id" />
<!-- 使用many-to-many来映射1-N关联,
增加unique="true" -->
<many-to-many class="Address"
unique="true"/>
</set>
双向1——N关联:
对于1——N关联,hibernate推荐使用双向关联,而且不要让1的一端控制关联,使用N的一端控制关联关系;
双向的1——N和N——1是完全相同的两种形式;
两端都需要增加对关联属性的访问:
eg:
Preson.java
//1-N关联关系,使用Set来保存关联实体
private Set<Address> addresses
= new HashSet<Address>();
Address.java
//保留关联实体的person属性
private Person person;
Preson.hbm.xml
<!-- 映射集合属性,集合元素是其他持久化实体
没有指定cascade属性 -->
<set name="addresses" inverse="true">
<!-- 指定关联的外键列 -->
<key column="person_id"/>
<!-- 用以映射到关联类属性 -->
<one-to-many class="Address"/>
</set>
Address.hbm.xml
<!-- 使用many-to-one映射N-1关联实体 -->
<many-to-one name="person"
column="person_id" not-null="true"/>
无连接表的双向1——N关联:
底层数据库记录了这种1——N关联关系,实际上只需要在N的一端的数据表里增加一个外键列即可,
这里存在一个问题:
双向映射时<many-to-one.../>元素将用到外键列,
<set.../>元素里的<key.../>子元素也用来映射外键列;
其他的都映射在同一列,所以映射文件应该为这两个元素指定的column属性,并让两个column属性值相同;
通常在多的一端控制关联关系,我们在<set.../>元素中设置 inverse=”true“
eg:
Preson.hbm.xml:
<!-- 映射集合属性,集合元素是其他持久化实体
没有指定cascade属性 -->
<set name="addresses" inverse="true">
<!-- 指定关联的外键列 -->
<key column="person_id"/>
<!-- 用以映射到关联类属性 -->
<one-to-many class="Address"/>
</set>
Address.hbm.xml:
<!-- 使用many-to-one映射N-1关联实体 -->
<many-to-one name="person"
column="person_id" not-null="true"/>
有连接表的双向1——N关联:
有连接表的1——N关联类似于N——N关联
保证join中的key子元素的column属性和set里many-to-many元素的column属性相同;
join里的many-to-one子元素的column属性和set里的key元素的column属性相同;
两端指定的连接表的Table属性不能省略,且属性值必须相同
eg:
Preson.hbm.xml:
<!-- 映射集合属性,集合元素是其他持久化实体
没有指定cascade属性 -->
<set name="addresses" inverse="true"
table="person_address">
<!-- 指定关联的外键列 -->
<key column="person_id"/>
<!-- 用以映射到关联类属性 -->
<many-to-many class="Address"
column="address_id" unique="true"/>
</set>
Address.hbm.xml:
<!-- 显式使用join元素确定连接表 -->
<join table="person_address">
<!-- key映射外键列 -->
<key column="address_id"/>
<!-- 使用many-to-one映射N-1关联实体 -->
<many-to-one name="person"
column="person_id" not-null="true"/>
</join>