您的位置:首页 > 其它

【hibernate】关联映射那些事(三)----双向映射

2016-08-28 20:46 507 查看
     今天来说一下双向的关联映射,单向的关联映射只是由一端来映射维护关联关系,而双向的关联映射是由两端都要维护关联关系。不过没有关系,只要我们搞清楚了那些基本的单向关联关系,对于双向的关联关系我们只要拆分为两个单向的关联映射就可以了,也就是双向关联映射可以简单的理解为两个单向的关联映射,但是作为双向的关联映射其中还是有一些小的细节的东西,需要我们注意。

     双向1-N关联

     对于双向的关联关系,需要在实体类的两端都要加入另一端的引用。1的一端需要加入多的一端的set集合属性,N的一端需要加入1的一端的引用

     对于无连接表的双向1-N映射,可以参照单向1-N的配置文件和单向N-1的关联映射。

      在这里需要注意的一点就是使用1-N双向关联映射不要让1的一端控制关联关系,而是要使用N的一端控制关联关系。这是就需要在<set…/>元素中指定inverse=“true”,用于指定1的一端不控制关联关系。

      此外,还需注意的是:对于无连接表的双向1-N关联映射,需要在N的一端的数据表里增加一个外键列,这就存在一个问题,<many-to-one…/>元素将映射到外键列,而<set…/>元素里的<key…/>也用于映射外键列。因此需要映射文件为这两个元素指定column属性,并让这两个cloumn属性值相同。从这一点就可以看出其实双向的关联映射就是两个单向的关联映射的和。为了保证映射到同一个列中,我们需要人为设置列名。

 

     对于有连接表的双向1-N关联映射,我们可以参照有连接表的单向1-N关联映射和单向的N-1关联映射,在两端分别配置就可以了,需要注意的一点就是,我们需要人为的设置两端的管理表,也就是说我们要指定连接表的table属性,且属性值必须相同。同时<join…/>

元素中的<key…/>子元素和<many-to-many>元素的column属性相同,并且要一致。

 

双向N-N关联

双向多对多的关联映射只能使用连接表来保存关联关系,所以要在两端的配置文件中都要使用<many-to-many>元素,同时在实体类中还要引入另一端的Set集合,需要注意的同样的问题就是<many-to-many>元素中的table属性值要指定且要相等。

 

双向1-1关联

        基于外键的双向1-1关联,外键可以存放在任意一边,需要存放外键的一端,需要增加<many-to-one…/>元素,同时增加unique=”true”属性来表示该实体是1的一端。当我们选择一个表来增加外键(使用many-to-one)后,该表即变成从表,而另一个表则成为主表。

         另一端需要使用<one-to-one…/>元素,该元素需要使用name属性指定关联属性名。为了不再增加一列,而是使用外键关联,使用property-ref属性指定引用关联类的属性。

         <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="com.tgb.hibernate.Person" table="t_person">
<id name="id" column="person_id">
<generator class="native" />
</id>
<property name="name" />
<property name="age" />
<one-to-one name="address" property-ref="person" />
</class>
</hibernate-mapping>

<hibernate-mapping >
<class name="com.tgb.hibernate.Address" table="t_address">
<id name="id" column="address_id">
<generator class="native" />
</id>
<property name="name" />
<property name="age" />
<many-to-one name="person" unique="true" column="person_id" not-null="true" />
</class>
</hibernate-mapping>  
          基于主键的双向1-1映射,基于主键的双想1-1映射,其中一端的主键生成策略要设置为foreign,表明将对方的主键作为自己的主键

         <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="com.tgb.hibernate.Person" table="t_person">
<id name="id" column="person_id">
<generator class="native" />
</id>
<property name="name" />
<property name="age" />
<one-to-one name="address" />
</class>
</hibernate-mapping>

<hibernate-mapping >
<class name="com.tgb.hibernate.Address" table="t_address">
<id name="id" column="address_id">
<generator class="foreigh" >
<param name="property">person</param>
</generator>
</id>
<property name="name" />
<property name="age" />
<one-to-one name="person" />
</class>
</hibernate-mapping>
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: