由于表和表之间存在多种关系
一对一
一对多
多对多
如何建表
在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 的一对多关联映射
-
我们先正常在数据库中建表,关系为一对多,这里不演示了,建成了Customer表和Commod表
-
我们开始创建持续化类,创建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,如果由多的那一方存入,外键是存在的。