基於Jpa中ManyToMany和OneToMany的雙向控制
Jpa ManyToMany和OneToMany的雙向控制
下面我們使用權限管理中Role<->Account(用戶ManyToMany賬號)、Role<->Domain(用戶OneToMany權限域)的關系來舉例。
1、ManyToMany
Role表
Account表
在兩個表的對應屬性上添加JoinColumns和inverseJoinColumns,並且相互交換。
JoinColumn
指定本表在中間表中的列名。inverseJoinColumns
指定受控方的列名。
在兩個類中都加上這兩個屬性,並且值互換,則能夠實現雙向控制,即任何一方刪除,都會自動刪除對應中間表的數據。
2、OneToMany以及ManyToOne
Role表
Domain表
cascade用來指定級聯操作, cascade的值隻能從CascadeType.PERSIST(級聯新建)、CascadeType.REMOVE(級聯刪除)、CascadeType.REFRESH(級聯刷新)、CascadeType.MERGE(級聯更新)中選擇一個或多個。還有一個選擇是使用CascadeType.ALL,表示選擇全部四項。
如果不指定Cascade,默認是空的,那麼在刪除Role的時候,隻會把Domain表中的role這一列的值刪除,而該條記錄不刪除。
JoinColumn需要指定,如果不指定就會在Domain表中增加額外的一列,這一列與Domain的id一樣。經過試驗,不指定還會造成級聯查找失敗,原因未知。
JPA中ManyToMany關系問題
配置JPA的時候多對多關系,報以下錯誤:
org.hibernate.AnnotationException: Illegal use of mappedBy on both sides of the relationship: com.csair.gme.core.domain.ComponentType.componentPropertys
解決辦法
不能兩邊都用mappedBy,隻能用一邊,而且用mappedBy的那一邊是從表,另外一邊就是主表。mappedBy=‘主表裡的變量名’
問題解決!
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 使用JPA雙向多對多關聯關系@ManyToMany
- SpringBoot + JPA @ManyToMany的操作要點說明
- 解決使用@ManyToMany查詢數據時的死循環問題
- Java Hibernate中的持久化類和實體類關系
- jpa實體@ManyToOne @OneToMany無限遞歸方式