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

原创 2016年08月28日 20:46:54

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

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

 

 

版权声明:那些你不愿意做的事情才能让你真正成长

hibernate一对多关联映射——双向(非常常用)

原文地址:http://blog.sina.com.cn/s/blog_5fad23090100fct8.html 一对多关联映射通常设为双向的,关系字段设置在一的一端,而且在多的一端维护, 一、...
  • springsen
  • springsen
  • 2012年08月08日 16:32
  • 3548

【Hibernate步步为营】--双向关联一对一映射详解(一)

一对一的映射在对象模型中是经常见到的,为了将对象模型转换为关系模型就必须在映射文件中进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是标签的使用,需要在映射的主对象中添加该标签,并将该对象的主...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年05月19日 09:41
  • 5836

【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年10月31日 08:39
  • 19331

【SSH进阶之路】Hibernate映射——多对多关联映射(八)

多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。   映射原理        不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年11月22日 08:14
  • 15037

Hibernate 关联映射 之 一对多单项关联 (二)聪明的懒加载

1、在映射文件中,关联的集合对象的懒加载Lazy有三种值:true、false、extra,通常我们使用extra,原因是该加载性能好。    对比下true 和 extra 两个值的不同加载情况 ...
  • yixiu285
  • yixiu285
  • 2012年07月12日 07:12
  • 475

【Hibernate步步为营】--(一对多映射)之双向关联

单向关联的一对多映射,在一的一端维护双向的关系这种做法虽然能实现但是存在很多缺陷,首先生成很多多余的SQL语句,因为多的一端不维护关系,只有一的一端维护,在进行操作时一的一端会发出多余的update语...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年05月25日 14:26
  • 4333

Hibernate 基于外键一对一映射(单双向)

主要内容: 映射关联关系 一对一关联映射的策略 基于外键的单(双)一对一关联映射 基于主键的单(双)一对一关联映射 基于外键的单向一对一实际上是多对一关联映射的特例 采用标签,指定多的一端的uniq...
  • lm709409753
  • lm709409753
  • 2016年04月01日 19:21
  • 915

【hibernate】关联映射那些事(二)--单向1-N映射和单向N-N映射

上一篇文章介绍了N-1关联映射和1-1关联映射,当然了都是单向的映射。这一次我们来看看单向的1-N关联映射。        单向1-N的关联映射是由1的一端来维护两个实体类的关联关系,所以在1的一端...
  • u012331102
  • u012331102
  • 2016年08月28日 18:29
  • 454

【SSH系列】hibernate映射 -- 一对一双向关联映射

开篇前言      上篇博文【SSH进阶之路】hibernate映射——一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来...
  • u010850027
  • u010850027
  • 2016年06月20日 00:00
  • 4750

Hibernate读书笔记-----Hibernate的关联映射之N-N关联映射 .

四、N—N关联关系          1.1单向N-N的关联          单向的N-N关联和1-N关联的持久化类完全一样,控制关系的一端需要增加一个set集合属性,被关联的持久化实例以集合的...
  • chenssy
  • chenssy
  • 2012年07月05日 09:24
  • 2837
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【hibernate】关联映射那些事(三)----双向映射
举报原因:
原因补充:

(最多只允许输入30个字)