多对多映射配置
- 创建实体类,人和身份
- 让两个实体类 之间互相表示
- 一个人里面表示所有的身份,使用set集合
- 一个身份对应很多人
- 一个人里面表示所有的身份,使用set集合
- 配置映射文件
- 基本配置
- 配置多对多关系
- 人实体类映射配置文件
- 身份实体类映射配置文件
- 人实体类映射配置文件
- 配置核心配置文件,将映射配置文件引入 到核心配置文件中
- 运行工具类测试,成功创建了三张表格
多对多级联保存
- 第一步:在一端配置文件,这里使用人实体类映射配置文件中的set标签进行配置,cascade 属性值改为save-update
第二步:写代码实现
创建人和身份对象,将身份保存到人里,最终保存人就可以了,只需要操作一端
@Test public void add() { SessionFactory factory = null; Session session = null; Transaction transaction = null; try { factory = HibernateUtils.getSessionFatory(); session = factory.openSession(); // 开启事务 transaction = session.beginTransaction(); Position p1 = new Position(); p1.setPname("董事长"); Position p2 = new Position(); p2.setPname("总经理"); Position p3 = new Position(); p2.setPname("保安"); Person pe1 = new Person(); pe1.setName("小名"); pe1.setGender("男"); pe1.setPhone("3356"); pe1.setAge(36); Person pe2 = new Person(); pe2.setName("令狐冲"); pe2.setGender("男"); pe2.setPhone("666"); pe2.setAge(18); // 建立关系 pe1.getSet().add(p1); pe1.getSet().add(p3); pe2.getSet().add(p2); pe2.getSet().add(p1); // 保存数据 session.save(pe1); session.save(pe2); // 提交事务 transaction.commit(); } catch (Exception e) { // 如果发生异常,回滚 transaction.rollback(); }finally { // 关闭资源 if(session != null) { session.close(); } if(factory != null) { factory.close(); } } }
数据库结果:
- person人表:
- position身份表:
- p_p第三张表:
- person人表:
多对多级联删除
- 第一步:在一端配置文件,这里使用人实体类映射配置文件中的set标签进行配置,cascade 属性值改为delete
代码中,查询出配置的一端要删除的,然后进行删除方法
@Test public void delete() { SessionFactory factory = null; Session session = null; Transaction transaction = null; try { factory = HibernateUtils.getSessionFatory(); session = factory.openSession(); // 开启事务 transaction = session.beginTransaction(); // 查询出要删除的person表格的内容 Person person = session.get(Person.class, 3); // 执行Session的删除方法 session.delete(person); // 提交事务 transaction.commit(); } catch (Exception e) { // 如果发生异常,回滚 transaction.rollback(); }finally { // 关闭资源 if(session != null) { session.close(); } if(factory != null) { factory.close(); } } }
- 数据库结果:
- person 表格:
- postion身份表格:
- p_p表格:
- person 表格:
- ==注意:==
- 多对多的关系是靠第三表来维护的,所以不建议执行级联删除操作,可以直接修改第三表实现
多对多中维护第三张表
- ==多对多的关系靠第三张表来维护==
给某个人添加身份
- 查询处要添加的身份,和被添加的人
将查询出的身份添加到人的set集合中
@Test public void update() { SessionFactory factory = null; Session session = null; Transaction transaction = null; try { factory = HibernateUtils.getSessionFatory(); session = factory.openSession(); // 开启事务 transaction = session.beginTransaction(); // 查询出要添加的人 Person person = session.get(Person.class, 2); // 查询出给人添加的身份 Position position = session.get(Position.class, 1); // 添加方法 person.getSet().add(position); // 持久态自动跟新数据库,不需要手动调用方法 // 提交事务 transaction.commit(); } catch (Exception e) { // 如果发生异常,回滚 transaction.rollback(); }finally { // 关闭资源 if(session != null) { session.close(); } if(factory != null) { factory.close(); } } }
- 数据库结果:成功给2号人,添加了1号身份
- 数据库结果:成功给2号人,添加了1号身份
给某个人移除某个身份
@Test public void remove() { SessionFactory factory = null; Session session = null; Transaction transaction = null; try { factory = HibernateUtils.getSessionFatory(); session = factory.openSession(); // 开启事务 transaction = session.beginTransaction(); // 查询出要添加的人 Person person = session.get(Person.class, 2); // 查询出给人添加的身份 Position position = session.get(Position.class, 1); // 移除查询的身份 person.getSet().remove(position); // 持久态自动跟新数据库,不需要手动调用方法 // 提交事务 transaction.commit(); } catch (Exception e) { // 如果发生异常,回滚 transaction.rollback(); }finally { // 关闭资源 if(session != null) { session.close(); } if(factory != null) { factory.close(); } } }
- 数据库结果:成功移除2号人中 的1号身份
- 数据库结果:成功移除2号人中 的1号身份