2014-10-27 101 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