8、Hibernate多表关系级联映射

4 篇文章 0 订阅
4 篇文章 0 订阅

一.表与表的多表关系

【一对多】
建表原则:在多的一方创建外键指向一的一方
在这里插入图片描述
【多对多】
建表原则:创建一个中间表,中间表中至少有两个字段作为外键分别指向多对多双方表的主键。
在这里插入图片描述

【一对一】
建表原则有两种
一种:唯一外键对应:假设一对一种的任意方,在多的一方创建外键指向一的一方的主键,然后将外键设 置为唯一。
二种:主键对应:一方的主键作为另一方的外键 。

在这里插入图片描述

二.对象描述表的关系

所谓关联映射就是讲关联关系映射到数据库里,在对象模型中就是一个引用或者是多个引用。在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> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值