一.概念
- 現有一場景:一個管理者可以管理多個網吧,一個網吧可以被多個管理者管理。從中抽象出一個多對多的例子user-bar。
- 主要方user:多對多裡面裡面會有第三張表user_bar,由主要方維護這裡面的外鍵記錄,也就是建立一個user的時候必須指定其管理的bar。
- 被控方bar:沒有權利更新外鍵記錄。單獨建立一個bar,不需要也不能指定其屬于哪個user。
二. CascadeType
- CascadeType.MERGE:級聯更新。建立一個user的時候,指定其管理哪些bar,如果某一個bar不存在,會在建立user的時候一起建立。
- CascadeType.PERSIST:級聯儲存。建立一個user的時候,指定其管理哪些bar,如果某一個bar不存在,抛出異常。是以指定其管理哪些bar必須是事先存在的。
- CascadeType.REMOVE:級聯删除。删除一個user的時候,會删除它管理的bar,最終是user_bar裡面删了,bar裡面也删了。如果不指定CascadeType.REMOVE,隻删user_bar裡面。
- CascadeType.REFRESH:級聯重新整理。第一次查詢某一user和第二次查詢同一user之間,删除了某一bar,CascadeType.REFRESH是的任何時候看到的都是最新的記錄(兩次查詢結果不一樣)。
- CascadeType.ALL:包含以上所有。
三. 使用
- 根據具體的場景要指定不同的Type。
- user和bar之間的關系,并沒有說user不存在了,網吧就不存在,是以不能用CascadeType.REMOVE。
- 儲存一個user的時候,指定他能夠管理的網吧必須是已經存在的,是以CascadeType.MERGE和CascadeType.PERSIST中用CascadeType.MERGE。
四. 吐槽
第一次接觸CascadeType,去網上找資料的時候,NM,全部是一樣的文章,甚至連錯誤都是一起copy過去的,真不贊同這樣的學習方式。