2014-10-27 100 views
13

我有3個實體與多對多的關係如下圖所示:java.lang.IllegalStateException:與@ManyToMany 3個實體相同的實體的多種表示

角色實體:

@Entity 
public class Role { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer roleID; 
    private String roleName; 
    private String description; 

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.EAGER) 
    @JoinTable(name = "role_permission", joinColumns = {@JoinColumn(name = "role_id")}, inverseJoinColumns = {@JoinColumn(name = "permission_id")}) 
    private Set<Permission> permissions = new LinkedHashSet<Permission>(); 

權限實體:

@Entity 
public class Permission { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int permissionID; 
    private String permissionName; 
    private String description; 

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.EAGER) 
    @JoinTable(name = "permission_functionality", joinColumns = {@JoinColumn(name = "permission_id")}, inverseJoinColumns = {@JoinColumn(name = "functionality_id")}) 
    private Set<Functionality> functionalities = new LinkedHashSet<>(); 

Functionalit Ÿ實體:

@Entity 
public class Functionality { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    private String name; 

我做了以下內容:

  1. 我已經創建了3種功能。

    functionality1, functionality2, functionality3 
    
  2. 然後創建2個權限:

    a. Permission 1 with functionality1, functionality2. 
    
    b. Permission 2 with functionality2, functionality3. 
    
  3. 然後在創建角色:

    Role 1 with Permission1 and Permission2 iam getting following exception 
    

    java.lang.IllegalStateException:同一實體的多種表示[com.persistence.entity.admin.Functionality#1]正在合併。獨立:[[email protected]];獨立:[email protected]]

回答

19

通過對權限的實體

+0

嘗試使用Hibernate級聯註釋而不是JPA註釋。例如,@ Cascade(CascadeType.SAVE_UPDATE )會取代{CascadeType.PERSIST,CascadeType.MERGE}。查閱本文:[JPA&Hibernate註解常見錯誤](https://www.mkyong。com/hibernate/cascade -jpa-hibernate-annotation-common-errors /) – 2017-05-21 20:26:00

0

去除CascadeType.MERGE對於休眠看到這裏HHH-9106解決辦法固定它。

+4

請引用最相關的鏈接部分,以防目標站點無法訪問或永久脫機。請參閱[我如何寫出一個好答案](http://stackoverflow.com/help/how-to-answer)。 – ByteHamster 2015-02-19 17:14:27

+0

或者萬一我的網絡阻塞了一些CSS文件,該網站是完全不可讀的。 – Stephan 2016-11-28 17:30:50

14

正確的解決方案就是升級到4.2.15休眠/ 4.3.6或以上,並添加以下行到你的persistence.xml:

<property name="hibernate.event.merge.entity_copy_observer" value="allow"/>

+8

該屬性適用於整個持久性上下文,只能用於測試目的。如果將其設置爲「允許」或「記錄」,Hibernate將繼續按順序合併兩個分離的實體。但是合併的順序沒有定義。所以這可能會導致意外的數據損壞。正確的解決方案是修復實體關係。 – VHS 2016-11-21 20:14:47

-1

只是說明說我在基於Spring Core 4.1.6的Spring MVC應用程序中使用Hibernate Core 4.3.8。解決方法:

<property name="hibernate.event.merge.entity_copy_observer" value="allow"/> 

不適合我。我需要刪除CascadeType.MERGE才能正確填充@ManyToMany。不確定新版本的Hibernate是否已經解決了這個問題。

+0

是不是你想知道你的代碼沒有出現;-) – kleopatra 2015-08-30 09:39:16

4

檢查您的equals和hashCode方法,確保它的一致性和正確定義。例如,我在複製並錯誤地粘貼另一個類時計算hashCode,這導致該對象永遠不會與它自己相等:(。

+0

爲我工作;) – baraka 2016-11-29 11:27:56

+0

很好的答案!謝謝! IntelliJ有一個生成'equals'和'hashCode'的過程,你可以在他們的網站上查看(https://www.jetbrains.com/help/idea/generating-equals-and-hashcode.html)。 – Casper 2017-06-20 08:34:06

+0

這有幫助!我使用Lombok的數據註釋來生成所有我的附加方法,當改爲Getter Setter而不是@Data時,問題已經消失。謝謝。 – crooveck 2017-07-25 07:26:31