Hibernate中单向一对多删除级联数据问题

	public static void main(String[] args) {

		// test();
		// test1();
		// test2();
		// test3();
		// test4();

		// test5();

		// 测试one2many 单向
		test6();
		// 测试单向 维护关系 delete删除操作
		// test7();
		// 测试单向 维护关系 delete更新操作
		// test8();

	}

	private static void test8() {
		// 获得 session 开启事务
		SessionFactory sessionFactory = new Configuration().configure()
				.buildSessionFactory();
		Session session = sessionFactory.openSession();
		session.beginTransaction();

		// 新建 一方数据 设置ID 为主键值
		PersonInfo personinfo = new PersonInfo();
		personinfo.setPerId("4028e5734cf9ddc8014cf9ddc9860001");
		// 删除该对象 并未执行删除多方数据
		session.delete(personinfo);
		session.flush();
		// 提交事务
		session.getTransaction().commit();
		// 关闭session
		session.close();

	}

	private static void test7() {
		// 获得 session 开启事务
		SessionFactory sessionFactory = new Configuration().configure()
				.buildSessionFactory();
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		// 载入该对象
		PersonInfo personinfo = (PersonInfo) session.load(PersonInfo.class,
				"4028e5734cf9d163014cf9d164fc0001");
		// 取出多方数据集合
		Set<One2Many> set = personinfo.getOne2many();
		Iterator<One2Many> iterator = set.iterator();
		// 迭代输出 多方 主键值
		while (iterator.hasNext()) {
			System.out.println(iterator.next().getTest4());
		}
		// 删除一方数据
		session.delete(personinfo);
		// 提交事务
		session.getTransaction().commit();
		// 关闭session
		session.close();
	}

	private static void test6() {

		// 获得 session 开启事务
		SessionFactory sessionFactory = new Configuration().configure()
				.buildSessionFactory();
		Session session = sessionFactory.openSession();
		session.beginTransaction();

		// 创建一方 对象值
		PersonInfo personinfo = new PersonInfo();
		personinfo.setPerName("单向one2many");

		// 创建多方数据并存入集合
		One2Many o = new One2Many();
		o.setTest2("单向1");
		One2Many o2 = new One2Many();
		o2.setTest2("单向2");
		One2Many o3 = new One2Many();
		o3.setTest2("单向3");
		HashSet<One2Many> set = new HashSet<One2Many>();
		set.add(o);
		set.add(o2);
		set.add(o3);
		// 将数据绑定一方数据
		personinfo.setOne2many(set);
		// 保存一方数据
		session.save(personinfo);
		// 提交事务
		session.getTransaction().commit();
		// 关闭session
		session.close();

	}

方法7与方法8的 执行结果是不一样的。

方法8 运行结果:

Hibernate: update Test set b=null where b=?

Hibernate: update one2many set test3=null where test3=?

Hibernate: delete from personinfo where perId=?

执行的是更新外键值为null

方法7执行结果:

Hibernate: select personinfo0_.perId as perId0_2_, personinfo0_.perName as perName0_2_, personinfo0_.perSex as perSex0_2_, personinfo0_.perAge as perAge0_2_, personinfo0_.perPhone as perPhone0_2_, personinfo0_.PerAddress as PerAddress0_2_, personinfo0_.perJob as perJob0_2_, personinfo0_.perEntryTime as perEntry8_0_2_, personinfo0_.PerDeparturetime as PerDepar9_0_2_, personinfo0_.perCreateDate as perCrea10_0_2_, personinfo0_.perLastModifyDate as perLast11_0_2_, mtwo2many1_.e as e4_, mtwo2many1_.a as a4_, mtwo2many1_.a as a4_0_, mtwo2many1_.b as b4_0_, mtwo2many1_.c as c4_0_, mtwo2many1_.d as d4_0_, mtwo2many1_.e as e4_0_, one2many2_.test3 as test4_5_, one2many2_.test4 as test1_5_, one2many2_.test4 as test1_6_1_, one2many2_.test1 as test2_6_1_, one2many2_.test2 as test3_6_1_, one2many2_.test3 as test4_6_1_ from personinfo personinfo0_ left outer join Test2 mtwo2many1_ on personinfo0_.perId=mtwo2many1_.e left outer join one2many one2many2_ on personinfo0_.perId=one2many2_.test3 where personinfo0_.perId=?

Hibernate: select one2one0_.test4 as test1_1_0_, one2one0_.test1 as test2_1_0_, one2one0_.test2 as test3_1_0_, one2one0_.test3 as test4_1_0_ from one2one one2one0_ where one2one0_.test4=?

4028e5734cf9e355014cf9e356720003

4028e5734cf9e355014cf9e356720004

4028e5734cf9e355014cf9e356720002

Hibernate: select mone2many0_.b as b1_, mone2many0_.a as a1_, mone2many0_.a as a3_0_, mone2many0_.b as b3_0_, mone2many0_.c as c3_0_ from Test mone2many0_ where mone2many0_.b=?

Hibernate: update one2many set test3=null where test3=?

Hibernate: delete from one2many where test4=?

Hibernate: delete from one2many where test4=?

Hibernate: delete from one2many where test4=?

Hibernate: delete from personinfo where perId=?

执行delete 是删除操作

时间: 2024-10-14 13:12:49

Hibernate中单向一对多删除级联数据问题的相关文章

Hibernate中的一对多与多对一映射

1.需求 一个部门有多个员工;         [一对多] 多个员工,属于一个部门    [多对一] 2.实体Bean设计 Dept: public class Dept { private int depId; private String depName; private Set<Employee> emps = new HashSet<Employee>(); set... get... } Employee: public class Employee { private

Hibernate中的一对多、多对多映射

一.一对多映射  如快递网点(ExpSite)与快递员(Deliver)的关系,即为一对多关系,一个快递网点有多个快递员,他们的关系如下图所示. 在一对多中,外键在多的一方 (1)在多的一方配置外键 Deliver表为多方,在Deliver实体类中放一个ExpSite方的引用做属性(外键),即所属网点ExpSiteId; Deliver实体类配置文件: <many-to-one name="ExpSiteId" class="ExpSite表所在的包名+ExpSite表

Hive中三种方式删除表数据内容

使用truncate仅可删除内部表数据,不可删除表结构 truncate table 表名 (truncate可删除所有的行,但是不能删除外部表) 使用shell命令删除外部表 hdfs -dfs -rm -r 外部表路径 使用 drop 可删除整个表 drop table 表名 原文地址:https://www.cnblogs.com/s1023/p/12588686.html

LevelDb简单介绍和原理——本质:类似nedb,插入数据文件不断增长(快照),再通过删除老数据做更新

转自:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html 有时间再好好看下整个文章! 说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat.这两位是Google公司重量级的工程师,为数甚少的Google Fellow之二. Jeff Dean其人:http://research.google.com/peop

(十一)Hibernate中的多表操作(1):单向一对多

一.单向一对多() 案例一(用XML文件配置): 一个会员(Member)可以有多个订单(Order),加载会员的时候自动加载订单,但是订单无法查看会员信息, public class Member { private String id; private String name; private Integer age; private Set<Order> orders = new HashSet<Order>(); //该Set集合里存放的是"多"方,加载

Hibernate中的映射关系(一对多)

在数据库中表和表之间的关系有几种,下面就详细说一下在Hibernate中怎样映射一对多的关系 Hibernate映射一对多的关系,其实就是持久类之间的映射,那如何把持久类关联起来呢??那就用到.hbm.xml文件的<many-to-one>标签了 具体做法如下: 新建一个customer类: package com.jeremy.hibernate.app.example; public class Customer { private Integer customerId; private

Hibernate中双向的一对多关系

何为双向,双向的意思就是你我之间可以互相通信(customer(1)和order(n)) 也就是说customer可以访问order,order也可以访问customer 二者构成了双向的关系 在Hibernate中如何实现双向的一对多关系呢?? 步骤: I在1的一端(也就是customer)添加n端(order)的集合列表,并添加get和set方法 package com.jeremy.hibernate.app.example.both; import java.util.HashSet;

Hibernate中一对多和多对一关系

1.单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时如果只需要获取对应部门信息(user.getdeptarment())不需要 从部门下的人员信息时,就配置成单向 多对一 使用部门时如果只需要获取部门下人员信息(deptartmanet.getusers())不需要 从人员获取部门信息时,就配置成单向 一对多 既要获取部门下人员 deptartmanet.getusers()又要从人员获取部门信息

Hibernate 中的 单向 一 对多 关系

之前看过 一本书  ,里面介绍 hibernate 的时候 反复强调了 不要  轻易 设置 单向的 一对多 关系 书中解释的原因是 影响 性能 (生成 的 sql 语句变多). 单向的 多 对 1 关系      外键依赖: 通过在 @ManytoOne 后  跟上 @CasCade 先persist从表记录,再persist主表记录时: 判断 主表没有相应记录的时候,从表等待主表插入记录后再插入(2条sql) 连接表: 两个实体类表 不存在 任何 依赖关系,连接表 依赖 这两个 实体类表. 两