Hibernate的一对多操作

Hibernate的一对多操作

一、基本配置

以班级和学生为例,一个班级里可以有多个学生,即一对多

1.创建两个实体类,班级和学生

2.让两个实体类互相表示,

1>一个班级实体内可以有多个学生

        private Set<Student> stuSet = new HashSet<Student>();

	public Set<Student> getStuSet() {
		return stuSet;
	}
	public void setStuSet(Set<Student> stuSet) {
		this.stuSet = stuSet;
	}

2>一个学生所属于一个班级

        private StuClass stuClass;
	
	public StuClass getStuClass() {
		return stuClass;
	}

	public void setStuClass(StuClass stuClass) {
		this.stuClass = stuClass;
	}

3.配置映射关系

1>一般一个 实体类对应一个映射文件

2>先完成最基本的映射配置

3>在班级映射文件中,表示多个学生

<set name="stuSet" cascade="save-update,delete" inverse="true" batch-size="10">
    <key column="scId"></key>
   	<one-to-many class="com.zhy.hibernate0207.model.Student"/>
    </set>

在学生映射文件中表示一个班级

<many-to-one name="stuClass" class="com.zhy.hibernate0207.model.StuClass" column="scId"></many-to-one>

4.将两个映射文件引入到核心配置文件中

<mapping resource="com/zhy/hibernate0207/model/Student.hbm.xml"/>
<mapping resource="com/zhy/hibernate0207/model/StuClass.hbm.xml"/>

二、级联操作

1.级联保存(简化操作)

添加一个班级为这个班级添加多个学生

在班级映射文件的Set标签中配置 cascade属性,设置为save-update ,表示级联保存

  <set name="stuSet" cascade="save-update" inverse="true" batch-size="10">

之后,创建班级和学生的实体类,然后把学生放进班级的set集合中,最后保存一下班级即可

       @Test
	public void addDemo(){
		SessionFactory factory = null;
		Session session = null;
		Transaction tr = null;
		try{
			factory = HibernateDbutils.getSessionFactory();
			session = factory.openSession();
			tr = session.beginTransaction();
			
			
			//级联保存
			Student stu = new Student();
			stu.setAge(20);
			stu.setStuName("小明");
			stu.setStuNo("154465456");
			
			
			Student stu1 = new Student();
			stu1.setAge(21);
			stu1.setStuName("小东");
			stu1.setStuNo("154465456");
			
			StuClass stuClass = new StuClass();
			stuClass.setcName("九年级五班");
			//将学生放进班级
			stuClass.getStuSet().add(stu1);
			stuClass.getStuSet().add(stu);
			//最后只需要保存stuClass即可
			session.save(stuClass);
			
			tr.commit();
	
		}catch(Exception e){
			e.printStackTrace();
			tr.rollback();
		}finally{
			session.close();
			factory.close();
		}
	}

2.级联操作

删除某个班级,并删除班级内的学生

1>在班级映射文件中的set标签属性cascade属性中,添加上delete,

<set name="stuSet" cascade="save-update,delete" inverse="true" batch-size="10">

2>根据Id查询出来班级,然后调用session.delete(stuClass)删除

    StuClass stuClass = session.get(StuClass.class, 1);
    session.delete(stuClass);

这样便可实现级联删除

三、一对多修改操作

将小明从三班转到四班

1.应为所查询出来的对象为持久态,持久天可以自动更新数据库,所以不需要有session的保存操作

Student xiaoming = session.get(Student.class, 1);
StuClass siban  = session.get(StuClass.class, 2);
//将小明所属班级修改为四班
xiaoming.setStuClass(siBan);
/在四班的set集合中加入小明
siban.getStuSet().add(xiaoming);

2.inverse属性

1>因为hibernate双向维护外键,在客户和联系人里面都需要维护外键,修改客户时候修改一次外键,修改联系人时候也修改一次外键,造成效率问题

2>解决方式:让其中的一方不维护外键

一对多里面,让其中一方放弃外键维护

一个国家有总统,国家有很多人,总统不能认识国家所有人,国家所有人可以认识总统

3>具体实现:

在放弃关系维护映射文件中,进行配置,在set标签上使用inverse属性

一般是,一的那一方放弃维护

 <set name="stuSet" cascade="save-update,delete" inverse="true" batch-size="10">
inverse为true,放弃维护,false进行维护,默认为false


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值