cascade和inverse一對多雙向映射實驗(各種情況分析)

本實驗在MySQL數據庫中測試:

建表:

create table teacher(id int primary key auto_increment,name varchar(50));

create table student(id int primary key auto_increment,name varchar(50),teacherid int references teacher(id));

 

Teacher.hbm.xml的配置:

{1} cascade="none" inverse="false"

{2} cascade="none" inverse="true"

{3} cascade="all" inverse="false"

{4} cascade="all" inverse="true"

 

執行的操作:

save(insert):

     Student s =new Student();

       s.setName("小明");

       Teacher t = new Teacher();

       t.setName("張老師");

       s.setTeacher(t);

       Set<Student> set = new HashSet<Student>();

       set.add(s);

       t.setStudents(set);

      

       session.save(t);

update:

此處有個前提條件就是數據庫中已近存在id4的一個老師,然後有個他的學生“小明”外鍵是4

       Student s = new Student();

       s.setName("小強");

       Teacher t = new Teacher();

       t.setId(4);

       t.setName("張老師");

       s.setTeacher(t);

       Set<Student> set = new HashSet<Student>();

       set.add(s);

       t.setStudents(set);

      

       session.update(t);

delete:

此處有個前提條件就是數據庫中已近存在id7的一個老師,然後有個他的學生“小明”外鍵是7

       Teacher t = (Teacher)session.get(Teacher.class, 7);

      

       session.delete(t);

 

結果以及分析:

{1}-①結果:

Hibernate: insert into teacher (name) values (?)

Hibernate: update student set teacherid=? where id=?

異常。inverse="false"teacher(一方)來維護關係,所以執行了一條update語句,但是由於沒有級聯,數據庫中卻沒有插入對應的student,所以update會出異常。

 

{2}-①結果:

Hibernate: insert into teacher (name) values (?)

       直接將teacher插入數據庫,無視student。相比{1}-①沒有update所以不會異常。

 

{3}-①結果:

Hibernate: insert into teacher (name) values (?)

Hibernate: insert into student (name, teacherid) values (?, ?)

Hibernate: update student set teacherid=? where id=?

設置級聯後成功插入,但是多了一句:update student set teacherid=? where id=?

inverse="false"teacher(一方)來維護關係,所以會將student的外鍵update一下來確保和teacher有關聯關係。

 

{4}-①結果:

Hibernate: insert into teacher (name) values (?)

Hibernate: insert into student (name, teacherid) values (?, ?)

成功插入兩條數據。相比{2}-①的結果少了一句update。因爲inverse="true"student(多方)維護關係,所以不會強制改student的外鍵爲teacherid但是如果沒有s.setTeacher(t)這句,則插入的student的外鍵則爲null

 

{1}-②結果:

Hibernate: update teacher set name=? where id=?

Hibernate: update student set teacherid=null where teacherid=?

Hibernate: update student set teacherid=? where id=?

    異常。{1}-①異常是一樣的。

 

{2}-②結果:

Hibernate: update teacher set name=? where id=?

 

{3}-②結果:

Hibernate: insert into student (name, teacherid) values (?, ?)

Hibernate: update teacher set name=? where id=?

Hibernate: update student set teacherid=null where teacherid=?

Hibernate: update student set teacherid=? where id=?

在這裏要解釋一下每個語句的意思。

第一句將“小強”插入到數據庫中,第二句將老師的信息修改,第三句很重要,是將以前老師的學生“小明”的外鍵teacherid設爲null,即小明不再是這個老師的學生了,第四句將小強的外鍵指向這個老師。

造成以上現象的原因就是由老師方維護關係,他不再要這個學生,但是又不能刪除他,就讓其外鍵爲null

 

{4}-②結果

Hibernate: insert into student (name, teacherid) values (?, ?)

Hibernate: update teacher set name=? where id=?

       這個就很簡單了。由學生方維護關係,修改老師不會對其學生造成影響。即原來他的學生“小明”還是他的學生,只不過又增加了“小強”。

 

{1}-③結果:

Hibernate: update student set teacherid=null where teacherid=?

Hibernate: delete from teacher where id=?

       由老師方維護關係,老師即將刪除,他很負責任的將他的學生的外鍵改成null

 

{2}-③結果:

Hibernate: delete from teacher where id=?

       {1}-③不同,他不會update學生的外鍵。

 

{3}-③結果:

Hibernate: update student set teacherid=null where teacherid=?

Hibernate: delete from student where id=?

Hibernate: delete from teacher where id=?

 

{4}-③結果:

Hibernate: delete from student where id=?

Hibernate: delete from teacher where id=?

 

作者:叉叉哥   轉載請註明出處:http://blog.csdn.net/xiao__gui/article/details/7719246 

發佈了65 篇原創文章 · 獲贊 10 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章