本實驗在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:
此處有個前提條件就是數據庫中已近存在id是4的一個老師,然後有個他的學生“小明”外鍵是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:
此處有個前提條件就是數據庫中已近存在id是7的一個老師,然後有個他的學生“小明”外鍵是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的外鍵爲teacher的id。但是如果沒有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