一对多级联操作
级联保存
- 添加一个订单,为这个订单添加多个商品
- 这样两个表都需要进行操作,称为级联保存
- 级联删除
- 删除某一个订单,这个订单里面的所有的商品都要删除
- 两张表的内容都要删除,称为级联删除
一对多级联保存演示
复杂写法:
代码:
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(); } } }
- 第一步:在客户的映射文件set标签内,进行配置,==cascade的 属性值为delete==,如果有多个值使用逗号分开
一对多修改操作
- 代码:
@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:放弃关系维护