基於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。

推薦閱讀: