Hibernate中 表的 一对多关系 和多对多关系 以及它们的级联操作

一、一对多关系
例如:客户和联系人的关系,一个客户可以有多个联系人,一个联系人属于一个客户
一对多映射配置:
第一步 创建两个实体类,客户和联系人(Customer LinkMan)
第二步 让两个实体类之间互相表示
1)在客户实体类中表示多个联系人
//hibernate 要求使用集合表示多个数据,使用set集合(set里没有重复元素)
private set<LinkMan> setLinkMan = new HashSet<LinkMan>();
然后实现 set 和get 方法。
2)在联系人实体类中表示所属客户(一个联系人只能属于一个客户)
private Customer customer;
然后实现get 和set 方法
第三步 配置映射关系
1)一般一个实体类一个映射文件
2)把映射最基本的配置完成
3)在映射配置文件中,配置一对多的关系
在客户的映射中表示所有的联系人
使 用set标签表示所有联系人
set标签里面有个name属性:属性值写在客户实体类里面表示联系人的set集合名称
<set name="setLinkMan">
<!-- 一对多建表有外键
hibernate机制:双向维护外键,在一和多的那一方都要配置外键
column属性值:外键名称
-->
<key column="clid"></key>
<!-- 客户所有联系人,class里面写的是联系人实体类的全路径-->
<one-to-many class=""/>
</set>
在联系人映射中表示所属客户
<!-- 表示联系人所属客户
name属性:因为在联系人实体类使用customer对象,写customer名称
class属性:customer全路径
column属性:外键名称;
-->
<many-to-one name="customer" class="" column="clid"></many-to-one>

一、级联保存
添加一个客户,为这个客户添加多个联系人
1、创建客户和联系人对象
Customer customer = new Customer();
LinkMan linkman = new LinkMan();//再用set方法添加数据
2.建立客户对象与联系人对象的关系
2.1把联系人对象放到客户对象的set集合里
customer.getSetLinkMan().add(linkman);
2.2把客户对象放到联系人里面
linkman.setCustomer(customer);
3.保存到数据库
session.save(customer);
session.save(linkman);
简化写法
一般根据客户添加联系人
第一步 在客户映射中进行配置
-在客户映射文件中set标签进行配置
<set name="setLinkMan" cascade="save-update">
第二步 创建客户和联系人对象, 只需要把联系人放到客户就可以了
不需要写linkman.setCustomer(customer);
和session.save(linkman);
二、级联删除
删除一个客户,这个客户里面的所有联系人也删除
具体操作
第一步 在客户映射文件 set标签中进行配置
1)使用cascade属性 属性值为delete
如果有多个值用逗号(,)隔开;
第二步 在代码中直接删除客户
1) 根据id查询对象,调用session里面的delete方法删除

执行过程:
1)根据id查询客户
2)根据外键的id值差联系人
3)把联系人外键设置为null
4)删除联系人和客户
三、级联修改
1、根据id查询联系人,根据id 查询客户
Customer baidu = session.get(Customer.class,1);
LinkMan lucy = session.get(LinkMan.class.2);
2、设置持久态对象值
//把联系人放到客户里面
baidu.getSetLinkMan().add(lucy);
/把客户放到联系人里面
lucy.setCustomer(baidu);
3、inverse属性(提高性能)
1)因为hibernate双向维护外键,在客户和联系人里面都需要维护外键,修改客户时候,修改一次外键,修改联系人的时候也修改了一次外键,所以更新了两次。
2)解决方式:让其中一方放弃维护外键
一对多的里面,让一的一方放弃维护外键。
3)具体实现
在放弃关系维护的映射文件中,进行配置,在set标签中使用inverse属性
inverse属性的默认值是false,表示不放弃关系维护
ture表示放弃关系维护


二、多对多关系
多对多映射配置
以用户和角色为例
第一步 创建实体类,用户和角色
第二步 两个实体类互相表示
1) 一个用户里面表示所有角色,使用set集合;
2)一个角色有多个用户,使用set集合
第三步 配置映射
1)基本配置
2)配置多对多关系
在用户里面表示所有角色,使用set标签
<set name="setRole" table="user_role">
<key column="userid"></key>
<many-to-many class="cn.itcast.manytomany.Role" column="roleid"></many-to-many>
在角色里面所有用户,使用set标签
<set name="setUser" table="user_role">
<key column="roleid"></key>
<many-to-many class="cn.itcast.manytomany.User" column="userid"></many-to-many>
第四步 在核心配置文件中引入映射文件

多对多级联保存
根据用户保存角色
第一步 在用户配置文件中set标签进行配置,cascade值save-update
第二步 写代码实现
1)创建用户和角色对象,把角色放到用户里面去,最终保存用户
多对多的级联删除
第一步 在set标签中进行配置,cascade值delete
第二步 删除用户

维护第三张表
让某个用户有某个角色
第一步 根据id查询用户和角色
第二步 把角色放到里面
1)把角色对象放到用户的set集合里
User lucy= session.get(User.class,1);
Role role =session.get(Role.class,1);
lucy.getSetRole().add(role);

让某个用户没有某个角色
1)从set集合里面把角色移除
User user= session.get(User.class,2);
Role role =session.get(Role.class,3);
user.getSetRole().remove(role);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值