可能重复:
休眠:具有相同标识符值的不同对象已与会话关联
删除实体时出现错误。我一次只有一个组中的用户,所以它是 User 类上的 ManyToOne 关系。在页面类中,我有一个属性组:
@Property @Persist private Group group;
在页面激活时填充:
public void onActivate(Group g) {
group = g;
}
单击删除 ActionLink 时,将执行以下操作:
@CommitAfter
public ListBillingUserGroups onActionFromDelete() {
for (User u : getUsersInGroup())
u.setGroup(null);
session.delete(group);
return listPage;
}
public List<User> getUsersInGroup() {
Criteria c = session.createCriteria(User.class)
.add(eq("company", ctx.getUser().getCompany()))
.add(eq("group", group));
return c.list();
}
当组中没有用户时,删除发生,浏览器重定向到列表页面(如预期的那样)。但是,如果组中有用户,那么我会从休眠中抛出异常,并带有消息:
a different object with the same identifier value was already associated with the session: [my.package.Group#10]
带有堆栈跟踪:
org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:613)
org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:121)
org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:793)
org.hibernate.impl.SessionImpl.delete(SessionImpl.java:771)
... my code ...
如果我将 onActionFromDelete 方法替换为:
@CommitAfter
public ListBillingUserGroups onActionFromDelete() {
for (User u : getUsersInGroup())
System.out.print(" >> " + u.getGroup());
session.delete(group);
return listPage;
}
错误仍然发生(而不是获得约束破坏异常),但如果我将其替换为:
@CommitAfter
public ListBillingUserGroups onActionFromDelete() {
session.delete(group);
return listPage;
}
我得到约束违反异常。
因此,它的行为就像调用 getAllUsersInGroup 方法将组对象更改为表示相同实体(相同类,相同 id)的另一个对象。关于我做错了什么的任何提示?