当前位置: 首页 > 面试题库 >

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

钱德元
2023-03-14
问题内容

我有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]


问题答案:

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



 类似资料:
  • 欢迎光临! 我见过同样的问题,但是解决方案对我没有帮助。 问题出现在我试图再去看牙医时。我添加了hashCode和equals方法,但没有任何帮助。移除级联类型。从访问中合并也没有帮助。我没法把它去掉。从牙医处合并,因为这样会出现另一个问题,在将访问添加到牙医之前,该访问必须存在。 堆栈跟踪: 我的班级: 谢谢你的帮助!

  • 首先,我已经阅读了Hibernate——一个包含多个实体的表?。 然而,我希望将两个实体映射到同一个表,但我希望它们都是实体,我可以从中选择。我的意思是: 一个表:人(id、姓名、出生日期、城市、街道、邮政编码)。 两个实体:人(id、name、dateOfBirth)、地址(id、城市、街道、邮政编码)。 实体之间是1:1的关系,但数据库中仍然是1个表。 如果我在上面的链接中使用建议的解决方案(

  • 我得同时更新三张表。当我从邮递员点击时,所有表都成功保存了,但当我尝试更新时,它抛出了catch异常,就像同一个实体的多个表示一样。 EmployeeDetails InvalidDataAccessapiUsageException:正在合并同一实体[com.icore.payroll.attendance.entity.EmployeeDetails#379]的多个表示形式。已分离:[Empl

  • 目前正在进行一个项目,我的Spring Boot项目需要在同一个DB服务器中利用多个数据源或模式。我发现了几个在spring boot中教授多数据源配置的教程,其中实体foo存在于数据源A中,bar存在于数据源B中,即下面的内容。, https://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-和spring数据j

  • 问题内容: 假设我有一个包含200列的表格,其中大多数从未使用过。 我将SmallEntity映射到经常使用的10列。我在与其他实体的关联中使用它。它加载速度快,消耗很少的内存,让我很高兴。 但是有时我需要显示200列。我想在200列上映射BigEntity类。它没有绑定到其他实体,也没有关联。 问题:您有这样做的经验吗?您是否知道Hibernate可能会遇到的任何麻烦,例如在一级缓存,脏检查和实

  • Tasklet类是在以下三个方法中定义的: 面临的问题:该文件包含150,000条记录,因此,在doExecute()方法之后,它将150,000条数据记录存储在列表中。在doAfterStep()方法中,它试图将列表中的所有150,000条记录保存到数据库中,从而导致事务超时错误。 解决办法: 在这个阶段,我们如何在这里发送2个实体,Entity2和entity3?