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

问题描述 投票:20回答:11

我有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<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<>();
}

功能实体:

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

我做了以下事情:

  1. 我创建了3个功能: Functionality1, Functionality2, Functionality3
  2. 然后创建了2个权限: Permission1 with Functionality1, Functionality2 Permission2 with Functionality2, Functionality3
  3. 然后创建了一个角色: Role1 with Permission1 and Permission2

我收到以下异常:

java.lang.IllegalStateException:正在合并同一实体[com.persistence.entity.admin.Functionality#1]的多个表示。分离:[com.persistence.entity.admin.Functionality@4729256a];分离:[com.persistence.entity.admin.Functionality@56ed25db]

java hibernate jpa jpa-2.0 ejb-3.0
11个回答
32
投票

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


-1
投票

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

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

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


23
投票

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

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


12
投票

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


4
投票

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

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

在这里看到How to persist a new entity containing multiple identical instances of another unpersisted entity with spring-boot and JPA?


0
投票

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


0
投票

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

Way to debug

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

Solution::#

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

0
投票

@LazyCollection(LazyCollectionOption.FALSE

@OneToMany(cascade = CascadeType.ALL,orphanRemoval = true)

@JoinColumn(name =“translate_id”)


0
投票

我可以通过替换修复它

cascade = CascadeType.All

casecade={CascadeType.PERSIST,CascadeType.REMOVE}

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.