一、问题
我有三个实体有很多关系:
角色实体:
@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是否已经修复了这个问题。 |

1417

被折叠的 条评论
为什么被折叠?



