2010年9月3日 星期五

Hibernate 教學 - cascade

本篇主要是說明在組態檔中所使用的 cascade 選項

在之前的 "一對多"和"多對一"教學裡面都有出現過

那它主要的用意就是所謂的 "連鎖效應",以之前的程式作為例子

在一對多的 Room.hbm.xml 中

<set name="students" table="student" cascade="all" >....</set>


如果有以上的設定時,在 JSP 中模擬了三筆學生(Student)資料和兩筆宿舍(Room)資料

分別為 student1、student2、student3 和 room1、room2

最後在用 session.save() 將 room1 和 room2 關連到資料庫

那為什麼沒有 呼叫 save 將 Student 存入資料庫?

這就是因為有在組態檔中設定 cascade,如果沒有設定的話

就必須乖乖的執行三個 student 和 兩個 room 的 save()

如下:
session.save("student1");
session.save("student2");
session.save("student3");
session.save("room1");
session.save("room2");

所以如果有設定 cascade 的話,的確可以省下很多力氣,如果資料很多的話

對於連鎖效應的意思在於現在一對多的情形中

一個 Room 會認得很多個 Student,程式如下


public class room1 implements java.io.Serializable{
        private Long id;
        private String address;
        private Set students;    //一個 Room 參考到很多個 Student
        .............
}


所以如果有設定 cascade 的話,只要 儲存一個 room 的實體

Hibernate 就會連帶把 room 實體所關連(reference)到的所有 Student 一併存入資料庫

以上是以一對多的範例解釋,如果是多對一的話

就在 many-to-one 標籤中設定即可,如下:


<many-to-one name="room"
                     column="room_id"
                     class="MapPOJO.room"
                     cascade="all"
                     outer-join="true"/>

至於 cascade 的值可以有以下幾種:

1.  none  不做任何連鎖效應
2.  save-update  針對儲存或更新至資料庫
3.  delete  針對刪除
4.  delete-orphan  適用於在集合中的刪除某元素
5.  all  全都包含但不包含 delete-orphan



沒有留言:

張貼留言