【簡單易懂】JPA概念解析:CascadeType(各種級聯操作)詳解。

weixin_33859844發表於2017-08-10

本文閱讀時間5分鐘。由作者三汪首發於簡書。

更多JPA實體對映相關內容請查閱:


【在一切開始之前,我要先告訴大家:慎用級聯關係,不要隨便給all許可權操作。應該根據業務需求選擇所需的級聯關係。否則可能釀成大禍。切記】

  • CascadeType.PERSIST
    官方文件的說明:Cascade persist operation
    看到網上很多部落格對這一列舉值的解釋是:級聯持久化(儲存)操作(持久儲存擁有方實體時,也會持久儲存該實體的所有相關資料。)
    我的內心OS是:媽蛋。我也知道是級聯persist操作啊關鍵是怎麼操作啊。媽蛋。擁有方實體是個什麼玩意兒,該實體又是個什麼玩意兒。
    經過實踐檢驗,我的理解是:給當前設定的實體操作另一個實體的許可權。這個理解可以推廣到每一個CascadeType。因此,其餘CascadeType列舉值將不再一一詳細解釋。
    For example:
public class Student {
    @ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
    private Set<Course> courses = new HashSet<>();
    //其他程式碼略。
}

可以看到,我們在上面的程式碼中給了Student對Course進行級聯儲存(cascade=CascadeType.PERSIST)的許可權。此時,若Student實體持有的Course實體在資料庫中不存在時,儲存該Student時,系統將自動在Course實體對應的資料庫中儲存這條Course資料。而如果沒有這個許可權,則無法儲存該Course資料。

  • CascadeType.REMOVE
    Cascade remove operation,級聯刪除操作。
    刪除當前實體時,與它有對映關係的實體也會跟著被刪除。
  • CascadeType.MERGE
    Cascade merge operation,級聯更新(合併)操作。
    當Student中的資料改變,會相應地更新Course中的資料。
  • CascadeType.DETACH
    Cascade detach operation,級聯脫管/遊離操作。
    如果你要刪除一個實體,但是它有外來鍵無法刪除,你就需要這個級聯許可權了。它會撤銷所有相關的外來鍵關聯。
  • CascadeType.REFRESH
    Cascade refresh operation,級聯重新整理操作。
    假設場景 有一個訂單,訂單裡面關聯了許多商品,這個訂單可以被很多人操作,那麼這個時候A對此訂單和關聯的商品進行了修改,與此同時,B也進行了相同的操作,但是B先一步比A儲存了資料,那麼當A儲存資料的時候,就需要先重新整理訂單資訊及關聯的商品資訊後,再將訂單及商品儲存。(來自良心會痛的評論)
  • CascadeType.ALL
    Cascade all operations,清晰明確,擁有以上所有級聯操作許可權。

以上。
希望我的文章對你能有所幫助。
有什麼意見、見解或疑惑,歡迎留言討論。

相關文章