关闭

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

253人阅读 评论(19) 收藏 举报
分类:

       上一篇文章介绍了N-1关联映射和1-1关联映射,当然了都是单向的映射。这一次我们来看看单向的1-N关联映射。

       单向1-N的关联映射是由1的一端来维护两个实体类的关联关系,所以在1的一端需要使用<set>集合来保存多的一端。

       这次我们假定一个人可以有多个地址,在person类中我们引用Address实体,使用Set集合来保存多个Address实体

 

无连接表的单向1-N

       下面是使用无连接表的单向1-N的映射文件

<?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" />
		<!-- 映射集合属性 -->
		<set name="addresses">
			<!-- 指定关联的外键列 -->
			<key column="person_id" />
			<!-- 用一映射到关联类属性 -->
		<one-to-many class="Address"  />
		</set>
	</class>
</hibernate-mapping>

        在使用无连接的单向1-N映射文件中,我们知道这样两点 1)由1的一端来维护主键关系,多的一端无法知道1的一端。2)需要在多的一端来加入1的一端的外键关系。考虑到这两点,因为是由1的一端来维护关系的,所以在进行插入操作时,一端的实体d到多端的关联,一端的外键没有被当做多端的实体对象的一部分,因而在插入多的一端时无法为多的一端指定外键,需要一条额外的update语句,这样的话会影响性能。所以并不推荐使用1-N的单向关联,而改为使用双向的1-N关联(后面的文章会总结到)

 

使用连接表的单向1-N

   对于使用有连接表的1-N单向关联,则要使用<many-to-many>来映射关联实体。为了保证实体是1的一端,因此要为元素指定unique=”true”.

     

<?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" />
		<!-- 映射集合属性 -->
		<set name="addresses" table="t_person_address">
			<!-- 指定关联的外键列 -->
			<key column="person_id" />
			<!-- 使用many-to-many映射到关联 -->
		<many-to-many class="Address" column="address_id" unique="true"/>
		</set>
	</class>
</hibernate-mapping>
       当程序需要保存一个Person对象和两个Address对象的时候,并建立之间的关系的时候,需要5条insert语句其中包括三条对象的插入语句和两条建立Person和Address对象关系的语句。


单向N-N关系

单向N-N关系和上面提到的有连接表的单向1-N关系基本上是一样的,只有去掉<many-to-many>中的unique="true"就是单向N-N关联映射。




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:66735次
    • 积分:10247
    • 等级:
    • 排名:第1640名
    • 原创:163篇
    • 转载:3篇
    • 译文:0篇
    • 评论:3423条
    博客专栏