CascadeType.MERGE报错解决:Multiple representations of the same entity are being merged

一、问题

我有三个实体有很多关系:

角色实体:

@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.functional@4729256a];已分离:[com.persistence.entity.admin.functional@56ed25db]

二、解决方案: 

    1

  •   36赞
   user1188867    6 年前

通过删除权限实体上的CascadeType.MERGE修复了此问题

    2

  •   24赞
   Suraj Menon    6 年前

正确的解决方案应该是升级到Hibernate4.2.15/4.3.6或更高版本,并在persistence.xml中添加以下行:

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

    3

  •   13赞
   user1523177    5 年前

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

    4

  •   6赞
   W.Man    3 年前

我也遇到了同样的问题,通过在 application.yaml 文件夹。(重点:好方法,别的方法都没有properties,不起作用)

  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?

    5

  •   0赞
   Asif Aminur Rashid    3 年前

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

    6

  •   0赞
   razi    3 年前

哈希集中同时有多个对象时出错。可能是因为哈希函数不正确。哈希集根据两个对象之间的哈希函数检查对象的相等性。

调试方法

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

解决方案:#

  • 定义一对多关系时使用哈希集。
  • 避免使用列表。
  • 确保哈希函数正确无误。

    7

  •   0赞
   Paul Linux    2 年前

@懒散收集(懒散收集选项.FALSE

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

@JoinColumn(name=“translate_id”)

    8

  •   0赞
   Arul Rozario    2 年前

我可以通过更换

cascade = CascadeType.All

具有

casecade={CascadeType.PERSIST,CascadeType.REMOVE}

    9

  •   -1赞
   user3789608    6 年前

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

    10

  •   -1赞
   kleopatra letimok    6 年前

只需注意,我在基于SpringCore4.1.6的SpringMVC应用程序中使用HibernateCore4.3.8。解决方法:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值