java.lang.IllegalStateException:具有@ManyToMany 3实体的同一实体的多个表示forms

我有3个具有ManyToMany关系的实体,如下所示:

角色实体:

@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 permissions = new LinkedHashSet(); 

许可实体:

  @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 functionalities = new LinkedHashSet(); 

function实体:

  @Entity public class Functionality { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; 

我做了以下事情:

  1. 我创造了3个function。

     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]的多个表示。 分离:[com.persistence.entity.admin.Functionality@4729256a]; 分离:[com.persistence.entity.admin.Functionality@56ed25db]

通过删除Permission实体上的CascadeType.MERGE来修复它

正确的解决方案是升级到hibernate 4.2.15 / 4.3.6或更高版本,并将以下行添加到persistence.xml:

检查你的equals和hashCode方法,确保它是一致的并且正确定义。 例如,我在计算hashCode时复制并错误地粘贴了另一个类,这导致对象永远不会与自身相等:(。

我遇到了同样的问题并通过在application.yaml文件中添加一些配置来解决它。

  jpa: properties: hibernate: enable_lazy_load_no_trans: true event: merge: entity_copy_observer: allow 

在此处查看如何使用spring-boot和JPA持久保存包含多个相同实例的另一个未实现实体的新实体?

在我的例子中,在同一个@Transactional块中移动获取操作和保存操作解决了这个问题。

当我们在HashSet中有多个同时对象时可能会发生错误。由于哈希函数不正确,可能会出现错误.Hashset根据两个对象之间的哈希函数检查对象的相等性。

调试方式

只要尝试打印hashset就会看到多个相同类型的对象。

解::#

  • 在定义一对多关系时使用HashSet。
  • 避免使用列表。
  • 确保您的哈希函数应该是正确的。

无法添加评论……声望低:(

但正确的答案是@ user1523177的那个 – 不确定为什么它没有标记为已接受的答案 – https://stackoverflow.com/a/34420512/6914827

基本上,它是哈希和等于颠倒hibernate…修复它并删除CascadeType.MERGE不是你想要的!

对于Hibernate,请参阅HHH-9106的解决方法。

请注意,我在Spring MVC应用程序中使用Hibernate Core 4.3.8,基于Spring Core 4.1.6。 解决方法:

  

不适合我。 我需要删除CascadeType.MERGE才能正确填充@ManyToMany。 不确定是否有更新版本的Hibernate修复此问题。