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