一.一对一
1.基于外键的单向1-1,(Address不配置,为单向;若配置,则为双向)
以User和Address为例,主要配置如下:
其中,unique="true",表示N方唯一,每个User对象都有唯一的Address对象与之关联。
2.基于主键的双向1-1
以User和Address为例,主要配置如下:
其中,constrained="true",表示Address表的主键同时作为外键参考User表;另外,Address.hbm.xml文件,ID采用foreign生产策略,这样Hibernate就会保证Address对象与关联的User对象共享一个ID。
cascade="all"表示当保存、更新、删除User对象时,级联保存、更新、删除Address对象。
二.一对多
1.单向N-1
以Class和Student为例,
2.单向1-N
Student:
3.双向1-N
其中,column="classId"设定与持久化类的属性对应的表的外键(即设定class表的外键),<key column="classId">设定关联表(student表)的外键,即Student表的classId列是引用Class表的外键,key的column属性指的是Student表的列名。
inverse="true"控制反转,表示关联关系由N方(Student)维护,默认由一方(Class)维护,一般加上inverse="true"这句话,hibernate在执行时不再执行update语句(这里Update语句用来更新student表中的classId属性)。列如,班级甲添加学生李四,李四却选择班级乙,若不配置inverse="true",李四是班级甲的学生,若配置了inverse="true",李四就是班级乙的学生。
三.多对多
1.单向N-N
以Student和Course为例
2.双向N-N
Student:
多对多关联,第三个表用来记录ID,也可以添加额外属性。
四.自关联
1.基于外键的单向1-1,(Address不配置,为单向;若配置,则为双向)
以User和Address为例,主要配置如下:
User:
<many-to-one name="address" class="Address" column="addressId" cascade="all" unique="true"></many-to-one>
Address:
<!--Address:<one-to-one name="user" class="User" property-ref="address"></one-to-one>-->
其中,unique="true",表示N方唯一,每个User对象都有唯一的Address对象与之关联。
2.基于主键的双向1-1
以User和Address为例,主要配置如下:
User:
<one-to-one name="address" class="Address" cascade="all"></one-to-one>
Address:
<id name="id" column="addressId">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" class="User" constrained="true"></one-to-one>
其中,constrained="true",表示Address表的主键同时作为外键参考User表;另外,Address.hbm.xml文件,ID采用foreign生产策略,这样Hibernate就会保证Address对象与关联的User对象共享一个ID。
cascade="all"表示当保存、更新、删除User对象时,级联保存、更新、删除Address对象。
二.一对多
1.单向N-1
以Class和Student为例,
Student:
<many-to-one name="c" column="classId" class="Class" cascade="save-update"></many-to-one>
Class:
2.单向1-N
Class:
<set name="students" cascade="save-update" inverse="true">
<key column="classId"></key>
<one-to-many class="com.java1234.model.Student"/>
</set>
Student:
3.双向1-N
Student:
<many-to-one name="c" column="classId" class="Class" cascade="save-update"></many-to-one>
Class:
<set name="students" cascade="save-update" inverse="true">
<key column="classId"></key>
<one-to-many class="com.java1234.model.Student"/>
</set>
其中,column="classId"设定与持久化类的属性对应的表的外键(即设定class表的外键),<key column="classId">设定关联表(student表)的外键,即Student表的classId列是引用Class表的外键,key的column属性指的是Student表的列名。
inverse="true"控制反转,表示关联关系由N方(Student)维护,默认由一方(Class)维护,一般加上inverse="true"这句话,hibernate在执行时不再执行update语句(这里Update语句用来更新student表中的classId属性)。列如,班级甲添加学生李四,李四却选择班级乙,若不配置inverse="true",李四是班级甲的学生,若配置了inverse="true",李四就是班级乙的学生。
三.多对多
1.单向N-N
以Student和Course为例
Student:
<set name="courses" table="student_course" cascade="save-update">
<key column="student_id"></key>
<many-to-many class="Course" column="course_id"></many-to-many>
</set>
Course:
2.双向N-N
Student:
<set name="courses" table="student_course" cascade="save-update">
<key column="student_id"></key>
<many-to-many class="Course" column="course_id"></many-to-many>
</set>
Course:
<set name="students" table="student_course" inverse="true" >
<key column="course_id"></key>
<many-to-many class="Student" column="student_id"></many-to-many>
</set>
多对多关联,第三个表用来记录ID,也可以添加额外属性。
四.自关联
private Department parent;
private Set<Department> children=new HashSet<Department>();
<!-- parent属性,本类与Department(上级)的多对一 -->
<many-to-one name="parent" class="Department" column="PARENTID" ></many-to-one>
<!-- children属性,本类与Department(下级)的一对多 -->
<set name="children" cascade="delete" order-by="id" >
<key column="PARENTID"></key>
<one-to-many class="Department" />
</set>