本篇主要是說明在組態檔中所使用的 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
沒有留言:
張貼留言