一、问题
我有三个实体有很多关系:
角色实体:
@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;
}
我做了以下工作:
-
我创建了3个功能:
Functionality1, Functionality2, Functionality3
-
然后创建2个权限:
Permission1 with Functionality1, Functionality2 Permission2 with Functionality2, Functionality3
-
然后创建一个角色:
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
通过删除权限实体上的CascadeType.MERGE修复了此问题 |
2
正确的解决方案应该是升级到Hibernate4.2.15/4.3.6或更高版本,并在persistence.xml中添加以下行:
|
3
检查equals和hashCode方法,确保其一致且定义正确。例如,我在计算hashCode时复制并错误地粘贴了另一个类,这导致对象永远不等于自身:(。 |
4
我也遇到了同样的问题,通过在
|
5
在我的例子中,在同一个@Transactional块中移动fetch操作和save操作解决了这个问题。 |
6
哈希集中同时有多个对象时出错。可能是因为哈希函数不正确。哈希集根据两个对象之间的哈希函数检查对象的相等性。 调试方法只要尝试打印哈希集,就会看到多个相同类型的对象。 解决方案:#
|
7
@懒散收集(懒散收集选项.FALSE @OneToMany(cascade=CascadeType.ALL,orphanRemoving=true) @JoinColumn(name=“translate_id”) |
8
我可以通过更换 具有 |
9
对于Hibernate,请参见此处的解决方法 HHH-9106 . |
10
只需注意,我在基于SpringCore4.1.6的SpringMVC应用程序中使用HibernateCore4.3.8。解决方法: 不适合我。我需要删除CascadeType.MERGE才能正确填充@ManyToMany。不确定新版本的Hibernate是否已经修复了这个问题。 |