Hibernate的一对多、多对多操作

  • Post author:
  • Post category:其他


一、一对多操作

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)级联保存

第一步:创建多个角色对象,多个用户对象

第二步:建立关系,把角色放到用户里面

第三步:保存用户



版权声明:本文为qq_24065713原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。