一、一对多操作
1、一对多映射配置
第一步:创建两个实体类,客户和联系人
第二步: Hibernate要求使用set集合表示多的数据。在客户类里面使用
private Set<LinkMan> setLinkMan = new HashSet<LinkeMan>();
//setter,getter ...
第三步:在联系人类中
private Customer customer;
//setter,getter ...
第四步:建立两个基本映射配置文件
第五步:在客户映射文件,使用set标签表示所有联系人
<!--name属性表示联系人的set集合名称-->
<set name="setLinkeMan">
<!--Hibernate双向维护外键,column属性值表示外键名称-->
<key column="clid"></key>
<!--class里面写联系人实体类全路径-->
<one-to-many class="cn.itcast.entity.LinkMan">
</set>
第六步:在客户映射文件。在class标签里面写
<many-to-one name="customer" class="cn.itcast.entity.Customer" coluumn="clid">
</many-to-one>
第七步:创建核心配置文件
第八步:测试
2、一对多级联操作
(1)一对多级联保存:添加一个客户,为这个客户添加一个联系人
第一步:在测试类里面,事务处理部分,创建客户和联系人对象
….
//开启事务…
//创建客户对象customer
……
//创建联系人对象linkman
……
第二步:把联系人对象放到客户对象的set集合里面
customer.getSetLinkMan().add(linkman);
第三步:保存到数据库
session.save(customer);
session.save(linkman);
//提交事务...
.....
另一种写法:
第一步:在客户映射文件中set标签进行配置
<set name="setLinkMan" cascade="save-update">
第二步:创建客户和联系人对象
第三步:把联系人放到客户里面
第四步:保存客户到数据库
(2)一对多级联删除:散步某个客户,同时把客户里面的联系人全部删除
第一步:在客户映射文件里面进行配置cascade为delete
<set name="setLinkMan" cascade="save-update,delete">
第二步:根据id查询对象,调用session里面的delete方法
//开启事务...
//根据id查询对象
Customer customer = session.get(Customer.class , 3);
//调用方法删除
session.delete(customer);
//提交事务...
(3)一对多修改操作:修改客户的联系人,修改联系人的客户
第一步:根据id查询lucy联系人,根据id查询百度客户
Customer baidu = session.get(Customer.class,1);
LinkMan lucy = session.get(LinkMan.class,2);
第二步:设置持久态客户值(持久态自动更新数据库)
baidu.getSetLinkman().add(lucy);
lucy.setCustomer(baidu);
注意:
因为hibernate双向维护外键,在修改客户时候会修改外键,修改联系人时也修改外键,造成效率问题;
解决方式:让其中一方不维护外键。一对多里面,让一的那边放弃。在customer配置文件的set标签使用inverse属性。默认false表示不放弃维护。
<set name="setLinkMan" inverse="true">
二、多对多操作
1、多对多配置
第一步:创建实体类,用户和角色
第二步:让两个实体类互相表示
(1)一个用户里面表示多个角色,使用set集合
(2)一个角色有多个用户,使用set集合
第三步:配置映射关系
第四步:在核心配置文件中引入映射文件
第五步:测试
2、多对多级联操作
(1)级联保存
第一步:创建多个角色对象,多个用户对象
第二步:建立关系,把角色放到用户里面
第三步:保存用户