hibernate一对多级联操作
2017-12-26 18:32
411 查看
一对多级联操作
级联保存- 添加一个订单,为这个订单添加多个商品
- 这样两个表都需要进行操作,称为级联保存
- 级联删除
- 删除某一个订单,这个订单里面的所有的商品都要删除
- 两张表的内容都要删除,称为级联删除
一对多级联保存演示
复杂写法:代码:
package com.td.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.junit.Test; import com.td.domain.Goods; import com.td.domain.Order; import com.td.utils.HibernateUtils; public class Demo1 { @Test /* * 演示一对多级联保存 * */ public void test1() { SessionFactory factory = null; Session session = null; Transaction transaction = null; try { // 获取SessionFactory对象 factory = HibernateUtils.getSessionFatory(); // 获取Session对象 session = factory.openSession(); // 开启 事务 transaction = session.beginTransaction(); // 一对多级联保存 // 创建实体类 对象,设置属性值,但是和 表格中对应的唯一属性不需要设置 Order order = new Order(); order.setOaddress("山西"); order.setPhone("223"); Goods goods = new Goods(); goods.setGname("哇哈哈"); goods.setGaddress("河南"); goods.setPrice(2); // 给实体类对象建立联系 // 将商品放到订单的set集合 中 order.getSetGoods().add(goods); // 将订单放到商品属于的订单里 goods.setOrder(order); // 执行seesion的保存操作 session.save(goods); session.save(order); // 提交事务 transaction.commit(); } catch (Exception e) { e.printStackTrace(); // 如果出现异常,执行回滚操作 transaction.rollback(); }finally { // 关闭资源 if(session != null) { session.close(); } if(factory != null) { factory.close(); } } } }
表格结果:
订单表
商品表:
商品表中的oid是外键,对应订单表中的oid,为了便于观察可以键外键表的名字在映射配置文中修改为一样的
简化写法:
一般根据订单添加商品
在客户配置文件中set标签内进行配置
添加属性cascade:save-update
代码:
@Test /* * 演示一对多级联保存,简化写法,只需要写一端 * */ public void test2() { SessionFactory factory = null; Session session = null; Transaction transaction = null; try { // 获取SessionFactory对象 factory = HibernateUtils.getSessionFatory(); // 获取Session对象 session = factory.openSession(); // 开启 事务 transaction = session.beginTransaction(); // 一对多级联保存 // 创建实体类 对象,设置属性值,但是和 表格中对应的唯一属性不需要设置 Order order = new Order(); order.setOaddress("北京"); order.setPhone("556"); Goods goods = new Goods(); goods.setGname("六个核桃"); goods.setGaddress("山东"); goods.setPrice(5); // 给实体类对象建立联系 // 将商品放到订单的set集合 中,只需要维护一端,将商品放到订单里,不需要将订单放到商品里 order.getSetGoods().add(goods); // 执行seesion的保存操作,简化操作,只需亚欧保存order就可以 session.save(order); // 提交事务 transaction.commit(); } catch (Exception e) { e.printStackTrace(); // 如果出现异常,执行回滚操作 transaction.rollback(); }finally { // 关闭资源 if(session != null) { session.close(); } if(factory != null) { factory.close(); } } }
数据库表结果:
订单表:
商品表:
一对多级联删除
删除某个订单,将订单里的联系人都删除步骤:
第一步:在客户的映射文件set标签内,进行配置,==cascade的 属性值为delete==,如果有多个值使用逗号分开
根据id查询到要删除的对象,调用Session的里面的delete方法删除
@Test /* * 演示一对多级联删除,简化写法,只需要写一端 * */ public void test3() { SessionFactory factory = null; Session session = null; Transaction transaction = null; try { // 获取SessionFactory对象 factory = HibernateUtils.getSessionFatory(); // 获取Session对象 session = factory.openSession(); // 开启 事务 transaction = session.beginTransaction(); // 一对多级联删除 // 查询到要删除的实体类对象,只需要查询主键表 Order order = session.get(Order.class, 1); // 执行删除操作 session.delete(order); // 提交事务 transaction.commit(); } catch (Exception e) { e.printStackTrace(); // 如果出现异常,执行回滚操作 transaction.rollback(); }finally { // 关闭资源 if(session != null) { session.close(); } if(factory != null) { factory.close(); } } }
一对多修改操作
代码:@Test /* * 演示一对多级修改操作 * */ public void test4() { SessionFactory factory = null; Session session = null; Transaction transaction = null; try { // 获取SessionFactory对象 factory = HibernateUtils.getSessionFatory(); // 获取Session对象 session = factory.openSession(); // 开启 事务 transaction = session.beginTransaction(); // 一对多级联修改操作,将订单表的3号数据,匹配到商品的4号 Order order = session.get(Order.class, 3); Goods goods = session.get(Goods.class, 4); // 将4号商品放到3号订单里 order.getSetGoods().add(goods); // 持久态自动跟新数据库,不需要手动跟新 // 提交事务 transaction.commit(); } catch (Exception e) { e.printStackTrace(); // 如果出现异常,执行回滚操作 transaction.rollback(); }finally { // 关闭资源 if(session != null) { session.close(); } if(factory != null) { factory.close(); } } }
#
进行配置让某一方不维护外键,提高程序的效率方法:在一对多一的一方对应的实体类的映射配置文件中的set标签内添加属性inverse值设置为true
默认值是false:不放弃关系维护,改为true:放弃关系维护
相关文章推荐
- Hibernate一对多级联操作
- Hibernate学习之级联操作1——一对多关联关系
- hibernate的级联保存操作(一对多)
- Hibernate一对多级联操作
- hibernate中hbm的级联操作(一对多)
- 【Hibernate】(4)Hibernate的多表操作、级联操作与延迟加载
- hibernate 一对多(级联关系)
- Hibernate的学习之路二十七(多对多操作级联)
- hibernate中inverse的用法 + Cascade:负责控制关联对象的级联操作
- Hibernate级联操作Cascade
- hibernate 一对多 级联 保存修改 删除
- SSH级联操作报错:org.hibernate.exception.ConstraintViolationException: Could not execute
- Hibernate学习之级联操作4——多对多关联关系
- Hibernate学习-14:实体之间的关系及其配置,级联操作
- 一对多级联操作
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate入门(五)hibernate的级联(cascade)表操作
- 【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例
- Hibernate级联操作 注解
- 【极客营】Hibernate完成CRM的联系人的保存操作-技术分析之级联删除