删除与tapestry5休眠实体给出:[重复]“具有相同的标识符值不同的物体已经与所述会话相关联的”

StackOverflow https://stackoverflow.com/questions/1390008

  •  21-09-2019
  •  | 
  •  

  

<强>可能重复:结果   休眠:用相同的标识符值不同的对象是已经与所述会话

相关联的

我被抛出上删除的实体错误。我只在一个组的用户在同一时间,所以它的用户类多对一的关系。在页面I类有一个属性组:

@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;
}

错误仍然发生(相对于得到的约束voilation除外),但如果我将其替换为:

@CommitAfter
public ListBillingUserGroups onActionFromDelete() {
    session.delete(group);
    return listPage;
}

我得到的约束违反异常。

因此,它的行为就像调用getAllUsersInGroup方法改变组对象为表示相同的实体(同一类,相同的id)的另一个对象。任何线索,以什么我做错了吗?

有帮助吗?

解决方案

我想你应该尝试:

@Persist("entity")

由于@Pesist注释(不PARAMS)存储您的组对象的会话,你的时间将其删除,是一种超然的对象。

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

替代是存储组ID(而不是组对象),并在onActivate方法检索对象。

其他提示

我不知道挂毯,但在Hibernate中...

当试图删除的实体此消息发生的情况。:使用对象A(对类和id),而Hibernate会话已经有一个实例乙一个对应于该一对

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

有一个大约在Tapestry5维基本主题方法文档:

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

HTH

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top