日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate cascade的真正含义

發(fā)布時間:2023/12/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate cascade的真正含义 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

hibernate cascade 是 @OneToOne @OneToMany @ManyToOne @ManyToMany等注解的屬性,表示級聯(lián)操作。

/*** (Optional) The operations that must be cascaded to* the target of the association.** <p> By default no operations are cascaded.*/CascadeType[] cascade() default {};

谷歌翻譯對注釋的翻譯

必須級聯(lián)到關(guān)聯(lián)目標的操作。默認情況下沒有級聯(lián)操作。

這里解釋一下,級聯(lián)的意思是:本實體做了什么事,也要拉上 另一個關(guān)聯(lián)的實體,導(dǎo)致另一個實體跟著做事情。就是說我刪除了,你也得刪除! 關(guān)聯(lián)目標,指的是 關(guān)聯(lián)的那個實體。

?

在有中間關(guān)系表的情況下,比如 user/role/user_role 這三張表,只對應(yīng)User/Role兩個實體對象就夠了!中間表是由User對象或者Role對象維護的,不用另外新建user_role的實體!

user

id name

?

role

id name

?

user_role

user_id role_id

?

@Table(name = "user") @Entity public class User {@ManyToMany(fetch = FetchType.LAZY)@JoinTable(name = "user_role", joinColumns = {@JoinColumn(name= "user_id")}, inverseJoinColumns = {@JoinColumn(name = "role_id")})private Set<Role> roles;//get set ... } @Entity @Table(name = "role") public class Role {@ManyToMany(fetch= FetchType.LAZY)@JoinTable(name = "user_role", joinColumns = {@JoinColumn(name= "role_id")}, inverseJoinColumns = {@JoinColumn(name = "user_id")})private Set<User> users;// get set ... }

上述是對user,role多對多的關(guān)聯(lián)關(guān)系的配置。cascade沒有寫,即是默認值,就是不級聯(lián)的意思。

不級聯(lián)就是說,比如在User類中,@ManyToMany沒有寫cascade就是說,User的操作不影響Role的操作,也就是說針對user表的操作不影響role表的記錄。這個和user_role關(guān)系表沒關(guān)系!user_role表的映射關(guān)系的維護,和cascade寫不寫,寫什么值一點關(guān)系都沒有!hibernate會給你維護好關(guān)系表的記錄的,經(jīng)測試是先刪除關(guān)系記錄,再插入關(guān)系記錄。

?

如果,你發(fā)現(xiàn)User針對Role屬性的cascade沒有寫,但是修改了role的值,確發(fā)生變更了,打印出sql語句,也發(fā)現(xiàn)還是級聯(lián)更新了,咋回事?

這個我也郁悶了好久,hibernate真心不好用,太復(fù)雜了。經(jīng)過苦心調(diào)試終于明白了。不是cascade不寫沒有用,而是你對role的變更是不是先查詢出來的持久對象的操作。這樣的操作是針對Role持久化對象的修改,和級聯(lián)沒關(guān)系,就是說你直接修改了role對象,當然更新了值!

Set<Role> roles = new HashSet<>(); for (Long roleId : roleIds) {Role role = roleDAO.get(Role.class, roleId);role.setName(role.getName()+"_1"); //測試級聯(lián) roles.add(role); } user.setRoles(roles);
userDao.saveOrUpdate(user);

上述代碼,保存user的時候,即使cascade沒有寫,可是role記錄還是被改變了!原因就是,你通過roleId得到Role的時候,得到的是Role持久化對象,然后你改變了Role的值,那role記錄肯定變更了!這個變更和cascade沒有關(guān)系,是你自己變更的,能怪誰!請看下述代碼

Set<Role> roles = new HashSet<>(); for (Long roleId : roleIds) {Role role = roleDAO.get(Role.class, roleId);role.setName(role.getName()+"_1"); //測試級聯(lián)session.evict(role); //使持久化對象游離 roles.add(role); } user.setRoles(roles); userDao.saveOrUpdate(user);

這里就增加了一句代碼,再運行,你會發(fā)現(xiàn),Role值改變了,確實沒有使role記錄發(fā)生變更,這說明cascade不寫有用了。這時,你把User類下roles屬性上的casecase改為CascadeType.ALL,再運行你會發(fā)現(xiàn),role記錄又改變了,那這次role的變更才是真正因為是cascade的作用!

?

總結(jié):

1.hibernate實體關(guān)系中,cascade屬性表示 實體的操作是否 級聯(lián) 到 關(guān)聯(lián)的實體, 和中間表無關(guān)。

2.無論cascade寫不寫,寫什么, 中間表都將被hibernate很好的維護了。

3.cascade不寫,沒有生效,可能是因為你直接對 關(guān)聯(lián)的實體(持久化的對象) 進行操作了,游離化的 對象就不會有事!

?

所以說,如果你如果不想讓Role的修改影響到User,那你cascade就不要寫,針對User的操作也要注意不要使用持久化的對象(get,load得到的對象,hql得到的是游離化的對象),反之亦然。不用擔心中間表的關(guān)系維護! 如果你想讓Role的修改影響到User,那你就寫上cascade的值,級聯(lián)就生效了(user對象管它是持久對象還是游離對象)!

?

附錄:

/*** Defines the set of cascadable operations that are propagated* to the associated entity.* The value <code>cascade=ALL</code> is equivalent to* <code>cascade={PERSIST, MERGE, REMOVE, REFRESH, DETACH}</code>.** @since Java Persistence 1.0*/ public enum CascadeType {/** Cascade all operations 級聯(lián)所有操作 */ALL,/** Cascade persist operation 級聯(lián)新增 */PERSIST,/** Cascade merge operation 級聯(lián)更新或者新增 */MERGE,/** Cascade remove operation 級聯(lián)刪除 */REMOVE,/** Cascade refresh operation 級聯(lián)刷新 */REFRESH,/*** Cascade detach operation* 級聯(lián)分離* @since Java Persistence 2.0**/DETACH }

?

轉(zhuǎn)載于:https://www.cnblogs.com/hdwang/p/7241043.html

總結(jié)

以上是生活随笔為你收集整理的hibernate cascade的真正含义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。