1.一对多的单向关联关系
配置单向的一对多关系是从"一"这一方开始的.通过one-to-many来实现.由于在一对多的关系中,需要在一方持有多方的对象,因此需通过set或 bag来实现.
如:一个教师可拥有多名学生:
教师配置文件如下:
<?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="hibernate.ch08.Teacher" table="teacher" lazy="false">
<id name="id" type="integer">
<column name="id"></column>
<generator class="identity"></generator>
</id>
<property name="teacherName" type="string"></property>
<set name="students" fetch="select" cascade="save-update" lazy="false">
<key column="teacher_id"></key>
<one-to-many class="hibernate.ch08.Student"/>
<!-- inverse="true" 此属性用来更新速度,表示在执行主表teacher的更新时不更新从表student的值,如果改为false或去掉,就会更新.
这就是我们常见的student表中teacher_id值为空的情况
-->
</set>
</class>
</hibernate-mapping>
学生配置如下:
<?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="hibernate.ch08.Student" table="student" lazy="false">
<id name="id" type="integer">
<column name="id"></column>
<generator class="identity"></generator>
</id>
<property name="studentName" type="string"></property>
</class>
</hibernate-mapping>
虽然这种单向操作可以满足日常需要,但也存在问题,在保存被控对象时,需要先插入空值到被关联的字段中,(如果数据库建立非空约束,将会导致失败),然后再进行更新操作.这样将一个操作分两步,降低效率.
2.多对一关联
多对一是一对多的反向,在实际中为了避免只配置一对多的关联关系时所遇到的问题.通常会将一对多的关联配置为双向的.同时将关联关系的主控方设置为"多"的一方.这样就可避免上述问题.
对于多对一的关联需要在多的一方配置many-to-one
<many-to-one mane="user" class="User" column="user_id"/>
另外为了使多的一方为主控方,需要在一的一方设置inverse="true"的配置(set里设置)
3.多对多关联
多对多关联需要借助于中间表来实现.通过中间表,将这两个表之间的多对多的关联关系转换成它们分别与中间表的一对多关联关系.那么对于Hibernate不需要中间对象来实现这种转换,但是中间表还是需要建立的.
多对多的关系是通过many-to-many进行配置的,同样是由于在一方需要持有另一方对象的集合,所以集合对象是不可少的.
<set name="roles"
cascade="save-update"
inverse="false"
table="user_role">
<many-to-many class="Role" column="role_id"/>
</set>
<set name="rsers"
cascade="save-update"
inverse="true"
table="user_role">
<many-to-many class="User" column="user_id"/>
</set>