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

xiaoxiao2021-02-28  66

一、一对多关系 例如:客户和联系人的关系,一个客户可以有多个联系人,一个联系人属于一个客户 一对多映射配置: 第一步 创建两个实体类,客户和联系人(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);

转载请注明原文地址: https://www.6miu.com/read-2628410.html

最新回复(0)