您的位置:首页 > 其它

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:放弃关系维护
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: