(7) hibernate之级联cascade和关系维持inverse
hibernate的關(guān)聯(lián)關(guān)系,重點(diǎn)在理解級聯(lián)cascade和inverse
1、cascade一般用在級聯(lián)保存,級聯(lián)更新,級聯(lián)刪除上
?
? ?1.1cascade注解有兩種,一種是基于hibernate注解
org.hibernate.annotations.Cascade
org.hibernate.annotations.CascadeType
支持一下級聯(lián)
ALL,
PERSIST//級聯(lián)持久化,調(diào)用session.persist()時會觸發(fā)級聯(lián)事件
MERGE//級聯(lián)保存或者更新,jpa規(guī)范 hibernate為了支持jsr220 后面添加的,調(diào)用session.merge()時觸發(fā)級聯(lián)
REMOVE,//級聯(lián)刪除,jpa規(guī)范同上,調(diào)用session.delete()時觸發(fā)
REFRESH,
DELETE,//級聯(lián)刪除,session.delete()觸發(fā)
SAVE_UPDATE,//級聯(lián)保存或者更新session.save(),session.update(),session.saveOrUpdate();
REPLICATE,
? ? 配置示例
1.2第二種注解是基于jpa規(guī)范,也就是apache jsr220規(guī)范,也是ejb3的持久層規(guī)范
javax.persistence.CascadeType
? ? ALL,?
? ? ? ? PERSIST,調(diào)用session.persist()時觸發(fā)
? ? MERGE,調(diào)用session.merge()觸發(fā)
? ? ? ? REMOVE,調(diào)用session.delete()觸發(fā)
? ? ? ? REFRESH,
? ? ? ? DETACH
? ? 配置示例
@ManyToOne(cascade={CascadeType.MERGE}) @JoinColumn(name = "teacher_id") private Teacher teacher; 1.3級聯(lián)一般用在OneToOne和OneToMany上,這也是hibernate官方的推薦,有時候我們在開發(fā)中也用在 ? ? ? ? ? ?ManyToOne,ManyToMany上,只是想在測試上少寫點(diǎn)代碼而已,在持久化一個實(shí)體的時候級聯(lián)持久其他關(guān)聯(lián)實(shí)體,
? 如下:teacher和student是ManyToMany,加上了cascade注解,便于測試 @Test public void addStudentToTeacher(){ Student student1 = new Student("張三",20,20072733L); Student student2 = new Student("李四",20,20072734L); Student student3 = new Student("王五",20,20072735L); Teacher teacher = new Teacher("張老師"); teacher.getStudents().add(student3); teacher.getStudents().add(student2); teacher.getStudents().add(student1); this.teacherDao.save(teacher); }
2、inverse,英文意思是反向,反轉(zhuǎn)。在這里可以理解為控制反轉(zhuǎn),也就是說實(shí)體間的關(guān)系由誰控制,所以inverse用在實(shí)體關(guān)聯(lián)上。如OneToOne,OneToMany,ManyToMany?
? ? ?在OneToMany中,如果不指定inverse,那么hibernate會去找默認(rèn)的表來維持關(guān)系。
? ? ?例如用老師和課程兩個實(shí)體來說明,假設(shè)teacher和course是OneToMany的關(guān)系,
? ? ?配置如下:
? ? ?//通過外鍵teacher_id關(guān)聯(lián)teacher,inverse通過mappedBy來設(shè)置
@ManyToOne(cascade={CascadeType.MERGE}) @JoinColumn(name = "teacher_id") private Teacher teacher; @OneToMany(mappedBy="teacher",fetch=FetchType.LAZY,cascade={CascadeType.MERGE,CascadeType.REMOVE}) private Set<Course> courses = new HashSet<Course>();
關(guān)聯(lián)表teacher_course來維持關(guān)系。OneToOne和ManyToMany大同小異,這里不再累述!
總結(jié)
以上是生活随笔為你收集整理的(7) hibernate之级联cascade和关系维持inverse的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (6) Hibernate的集合映射
- 下一篇: (8)hibernate四种继承映射