hibernate的一对多关系映射

由于表和表之间存在多种关系
一对一
一对多
多对多
在这里插入图片描述

如何建表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在hibernate中如何用类实现

一对一:

class A{
	B b;
}
class B {
	A a;
}

一对多:

class A {
	Set<B> bs;
}
class B{
	A a;
	}

多对多:

class A{
	Set<B> bs;
}
class A{
	Set<A> as;
}

Hibernate 的一对多关联映射

  1. 我们先正常在数据库中建表,关系为一对多,这里不演示了,建成了Customer表和Commod表

  2. 我们开始创建持续化类,创建Customer类在属性中加入

private Set<Commod> commod = new HashSet<>();
//和外键作用类似

创建Commod 类 在属性中加入

private Coustomer customer;

创建映射文件

Customer映射文件:

<!--多加入配置-->
<!--
	key 标签:
		* column 属性:多的一方的外键名称-->
<set name="commod">
	<!--
		one-to-many 标签:
			* class属性:多的一方的类全路径
		-->
		<key column="---"/>
		<one-to-many class="------"/>
		</set>

Commed映射文件

<!--多加入文件-->
<!-- 
	many-to-one标签:多对一
		* name : 一的一方的对象
		* class :一的一方的类全路径
		* column:表中外键名称
-->
	<many-to-one name="customer" class="---------" column="xxx"/>

将映射添加到配置中

<mapping resource="src下路径"/>

一对多的级联操作

级联操作:操作一个对象的时候,是否会同时操作其关联的对象。
方向性:
	* 操作一的一方的时候,是否操作到多的一方
	* 操作多的一方的时候,是否操作到一的一方
级联保存或更新

我们如果将客户作为主控,那么就这样配置

<!--
	key 标签:
		* column 属性:多的一方的外键名称-->
<set name="commod" cascade="save-update"> //这里修改一点
	<!--
		one-to-many 标签:
			* class属性:多的一方的类全路径
		-->
		<key column="---"/>
		<one-to-many class="------"/>
		</set>

那么如果我们新保存客户时,有了新商品,那么新商品也会自动保存

//拿到session,并开启事务后
Customer customer = new Customer();
customer.setXXX(--);

Commed ---

//建立关系
customer.getCommed().add(commed);
commed.setCustomer(customer);
//保存 事务提交
session.save(customer);

相反 要让Commed成为主控也是一样,修改它的xml即可
我们可以称为双向的

对象导航问题 级联存储

通过下面的实例分析:
在这里插入图片描述

上面的就是 linkMan1 存储时,因为它关联了customer,customer又关联了linkMan2 ,3 所以全部都要存储 是4 个insert语句

级联删除

级联删除和 保存是一样的,都是有方向的,而且删除时是关联删除的,

<!--
	key 标签:
		* column 属性:多的一方的外键名称-->
<set name="commod" cascade="delete,save-update"> //这里修改一点
	<!--
		one-to-many 标签:
			* class属性:多的一方的类全路径
		-->
		<key column="---"/>
		<one-to-many class="------"/>
		</set>

相反 要让Commed成为主控也是一样,修改它的xml即可
我们可以称为双向的

如果我们不想删除被关联者,那么就需要将对象外键置null

Coustomer customer = session.get(Customer.class,1l);
coustomer.setXX(null);
session.delete(customer);
如何解决双向关联产生的多余sql

出现这种情况的原因:由于持久态对象会自动的更新数据库使用,会发送两次语句,修改俩次外键。
如何解决:放弃一方的外键维护权,我们一般选择放弃y一的那一方维护权,选择多的那一方拥有外键维护权
让一的那一方放弃维护权

<!--
	key 标签:
		* column 属性:多的一方的外键名称-->
<set name="commod" cascade="delete,save-update" inverse="true"> //这里修改一点
	<!--
		one-to-many 标签:
			* class属性:多的一方的类全路径
		-->
		<key column="---"/>
		<one-to-many class="------"/>
		</set>

设置后:如果由一的那一方session存入,那么外键为null,如果由多的那一方存入,外键是存在的。

猜你喜欢

转载自blog.csdn.net/qq_40435621/article/details/87902639