8、Hibernate多表关系级联映射
一.表与表的多表关系
【一对多】
建表原则:在多的一方创建外键指向一的一方
【多对多】
建表原则:创建一个中间表,中间表中至少有两个字段作为外键分别指向多对多双方表的主键。
【一对一】
建表原则有两种
一种:唯一外键对应:假设一对一种的任意方,在多的一方创建外键指向一的一方的主键,然后将外键设 置为唯一。
二种:主键对应:一方的主键作为另一方的外键 。
二.对象描述表的关系
所谓关联映射就是讲关联关系映射到数据库里,在对象模型中就是一个引用或者是多个引用。在Hibernate中采用Java对象关系来描述表与表之间的关系,具体如代码所示 .
一对一 一对多 多对多
classA{ class A{ class A{
B b; Set<B> bs; Set<B> bs;
} } }
class B{ class B{ class{
A a; A a; Set<A> as;
} } }
一对一的关系:就是在本类中定义对方类型的对象,相互定义
一对多的关系:需要在关系为一的类中定义一个关系为多的类的集合对象,关系为多的类需要在类里定义一个 关系为一的类的对象。
多对多的关系:双方的类中相互定义对方类的对象集合
三.Hibernate的一对多关系映射
表关系表达:
实体表达:
ORM元素中表达:
Customer 一对多
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lin.pojo">
<class name="Customer" table="t_customer">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<!--
表达一对多关系中的集合
name:集合的属性名
inverse:是否将关系的维护反转给对方,默认值:false;
true 在表中放弃维护外键
cascade:级联操作,
-->
<set name="orders">
<!--
key:用来描述属性
column:Order的外键属性
-->
<key column="customer_id"/>
<!-- one-to-many 表达 Customer 与 Order 的关系是一对多 -->
<one-to-many class="Order"/>
</set>
</class>
</hibernate-mapping>
Order 多对一
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lin.pojo">
<class name="Order" table="t_order">
<id name="id">
<generator class="native"></generator>
</id>
<property name="proname"/>
<!-- many-to-one 表达 Order 与 Customer 是多对一的关系
name:引用属性的名称
column:外键的列名
class:引用属性的类型
-->
<many-to-one name="customer" column="customer_id" class="Customer">
</many-to-one>
</class>
</hibernate-mapping>
四、Hibernate的多对多关系映射
表关系表达:
实体表达:
ORM元素中表达:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lin.pojo">
<class name="Student" table="student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="stuname"/>
<!--
多对多关系
set:表达集合
name:集合的属性名
table:中间表的名称
key:
column:外键,别人引用"我"的外键列名
many-to-many:表达多对的配置
class:和我多对多关系类名
column:我引用别人的外键名
-->
<set name="courses" table="student_course" cascade="save-update">
<key column="sid"></key>
<many-to-many class="Course" column="cid"></many-to-many>
</set>
</class>
</hibernate-mapping>
Course 多对多
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lin.pojo">
<class name="Course" table="course">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<!--
多对多关系
set:表达集合
name:集合的属性名
table:中间表的名称
key:
column:外键,别的类引用"当前类"的外键列名
many-to-many:表达多对的配置
class:和当前类多对多关系类名
column:当前类引用别人的外键名
-->
<set name="stus" table="student_course" inverse="true">
<key column="cid"></key>
<many-to-many class="Student" column="sid"></many-to-many>
</set>
</class>
</hibernate-mapping>