hibernate的关联关系,重点在理解级联cascade和inverse
1、cascade一般用在级联保存,级联更新,级联删除上
1.1cascade注解有两种,一种是基于hibernate注解
org.hibernate.annotations.Cascade
org.hibernate.annotations.CascadeType
支持一下级联
ALL, PERSIST//级联持久化,调用session.persist()时会触发级联事件 MERGE//级联保存或者更新,jpa规范 hibernate为了支持jsr220 后面添加的,调用session.merge()时触发级联 REMOVE,//级联删除,jpa规范同上,调用session.delete()时触发
REFRESH, DELETE,//级联删除,session.delete()触发 SAVE_UPDATE,//级联保存或者更新session.save(),session.update(),session.saveOrUpdate(); REPLICATE,
配置示例
- @Cascade(value={org.hibernate.annotations.CascadeType.ALL})
-
privateStudentInfostudentInfo;
1.2第二种注解是基于jpa规范,也就是apache jsr220规范,也是ejb3的持久层规范
javax.persistence.CascadeType
ALL,
PERSIST,调用session.persist()时触发 MERGE,调用session.merge()触发
REMOVE,调用session.delete()触发
REFRESH, DETACH
配置示例
- @ManyToOne(cascade={CascadeType.MERGE})
-
@JoinColumn(name="teacher_id")
-
privateTeacherteacher;
1.3级联一般用在OneToOne和OneToMany上,这也是hibernate官方的推荐,有时候我们在开发中也用在 ManyToOne,ManyToMany上,只是想在测试上少写点代码而已,在持久化一个实体的时候级联持久其他关联实体,
如下:teacher和student是ManyToMany,加上了cascade注解,便于测试
- @Test
-
publicvoidaddStudentToTeacher(){
-
Studentstudent1=newStudent("张三",20,20072733L);
-
Studentstudent2=newStudent("李四",20,20072734L);
-
Studentstudent3=newStudent("王五",20,20072735L);
-
-
Teacherteacher=newTeacher("张老师");
- teacher.getStudents().add(student3);
- teacher.getStudents().add(student2);
- teacher.getStudents().add(student1);
-
this.teacherDao.save(teacher);
- }
2、inverse,英文意思是反向,反转。在这里可以理解为控制反转,也就是说实体间的关系由谁控制,所以inverse用在实体关联上。如OneToOne,OneToMany,ManyToMany
在OneToMany中,如果不指定inverse,那么hibernate会去找默认的表来维持关系。
例如用老师和课程两个实体来说明,假设teacher和course是OneToMany的关系,
配置如下:
//通过外键teacher_id关联teacher,inverse通过mappedBy来设置
- @ManyToOne(cascade={CascadeType.MERGE})
-
@JoinColumn(name="teacher_id")
-
privateTeacherteacher;
-
@OneToMany(mappedBy="teacher",fetch=FetchType.LAZY,cascade={CascadeType.MERGE,CascadeType.REMOVE})
-
privateSet<Course>courses=newHashSet<Course>();
在这里指定teacher的属性courses的关系由关联实体Course的teacher属性维持,如果不配置,则会去找关联表teacher_course来维持关系。OneToOne和ManyToMany大同小异,这里不再累述!
分享到:
相关推荐
hibernate 级联(cascade和inverse)一对多,Jar包,数据库建表语句都好了,只要修改一下,数据库配置文件,就可以使用了,使用junit进行测试。
inverse Hibernate_级联关系说明_-_关于cascade和inverse的用法
Hibernate的级联操作(增,删,该)
Hibernate cascade (级联).docHibernate_cascade(级联).doc
hibernate3.2级联关系自身一对多双向关联,适合初学者熟悉hibernate框架。
Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单
HibernateHQL级联注意事项[归类].pdf
虽然Hibernate不怎么流行了不过有兴趣的可以看看
详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) 级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新。若对触发器来修改或删除关联表相记录,必须...
JavaProject实现hibernate3.2的级联关系,适合初学者熟悉各种级联关系。一对多,一朵一,多对多。
Hibernate级联操作一对多demo Hibernate级联操作一对多demo Hibernate级联操作一对多demo
hibernate 注解生成表 JPA注解1、@Entity(name="EntityName")必须,name为可选,对应数据库中一的个表2、@Table(name="",catalog="",schema="")可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体...
hibernate many-to-many级联保存,级联更新,级联删除
struts+hibernate+ajax级联菜单struts+hibernate+ajax级联菜单
第七章_Hibernate_-_级联策略 第七章
包括t_card主表和t_person从表,实现基于session和hql的hibernate级联增删改查;
Hibernate级联操作.docx
3.3、Hibernate级联关系(Av839011656,P3).mp4