1

可能重复:
休眠:具有相同标识符值的不同对象已与会话关联

删除实体时出现错误。我一次只有一个组中的用户,所以它是 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)的另一个对象。关于我做错了什么的任何提示?

4

3 回答 3

3

我认为你应该尝试:

@Persist("entity")

因为 @Pesist 注释(没有参数)将您的 Group 对象存储在会话中,并且在您删除它时,它是一个分离的对象。

http://tapestry.apache.org/tapestry5/tapestry-hibernate/userguide.html

另一种方法是存储组 id(而不是组对象)并在 onActivate 方法中检索对象。

于 2009-09-07T16:41:58.487 回答
0

我不知道 Tapestry,但在 Hibernate 中......

当您尝试使用对象 A 删除实体(对:类和 id)时,会发生此消息,而 Hibernate 会话已经具有对应于该对的实例 B。

例如,加载您的用户会加载实体(可能是惰性的)。因此,要删除组,您应该使用 Hibernate 使用的组实例(确切的 java 对象)作为用户组。如果您使用另一个实例,您将获得该异常。

于 2009-09-07T16:18:17.770 回答
0

Tapestry5 Wiki 上有关于此主题的 HowTo:

http://wiki.apache.org/tapestry/Tapestry5AvoidingDifferentObjectWithSameIDExceptions

高温高压

于 2009-12-22T08:56:06.897 回答