日期:2014-05-16  浏览次数:20533 次

浅析Hibernate映射(二)——关系映射(4)

 

单向一对多关联映射

映射后的关系模型:

映射文件:

一对多关联映射和多对一关联映射映射原理是一致的,都是在多的一端加入一个外键,指向一的一端

 

它们的区别在于维护的关系不同:


 * 多对一维护的关系是:多指向一的关系,有了此关系,在加载多的时候可以将一加载上来


 * 一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来

 

Group.hbm.xml

<?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 package="com.jialin.hibernate">

	<class name="Group" table="t_group">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
	
		<set name="users">
			<key column="groupid"/>
			<one-to-many class="User"/>
		</set>
	</class>

</hibernate-mapping>


User.hbm.xml

<?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 package="com.jialin.hibernate">
	<class name="User" table="t_user">
		<id name="id">
			<generator class="native" />
		</id>

		<property name="name" />

	</class>

</hibernate-mapping>


在一的一端维护关系存在缺陷:
 

* 因为多的一端User不知道Group的存在(也就是User没有维护与Group的关系)
 所以在保存User的时候关系字段groupid是为null的,如果将该关系字段设置为非空,则
 将无法保存数据


 * 另外因为User不维护关系,而Group维护关系,Group就会发出多余的update语句,保证
 Group和User有关系,这样加载Group的时候才可以把该Group对应的User加载上来

 

为了克服这些缺陷,我们一般将单向一对多关联映射改为双向的。如下:

 

映射后的关系模型与单向的一样:

 

采用一对多双向关联映射的目的主要是为了主要是为了解决一对多单向关联的缺陷,而不是需求驱动的。

映射文件:

一对多双向关联的映射方式:
 * 在一的一端的集合上采用<key>标签,在多的一端加入一个外键
 * 在多的一端采用<many-to-one>标签
 * <key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱

Group.hbm.xml

<?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 package="com.jialin.hibernate">

	<class name="Group" table="t_group">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
	
		<set name="users" inverse="true">
			<key column="groupid"/>
			<one-to-many class="User" />
		</set>
	</class>

</hibernate-mapping>


User.hbm.xml

 

<?xml version="1.0"?>
<!DOCTY