1

重複の可能性:
Hibernate: 同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられていました

エンティティを削除するとエラーがスローされます。一度に 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

Tapestry5 Wikiには、このトピックに関するハウツーがあります。

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

HTH

于 2009-12-22T08:56:06.897 に答える
0

タペストリーについてはわかりませんが、休止状態では...

このメッセージは、オブジェクト A を使用してエンティティ (クラスと ID のペア) を削除しようとしたときに発生しますが、Hibernate セッションには、このペアに対応するインスタンス B が既に存在します。

たとえば、ユーザーをロードすると、エンティティがロードされます (遅延の可能性があります)。したがって、グループを削除するには、ユーザーのグループとして Hibernate によって使用されたグループ インスタンス (正確な Java オブジェクト) を使用する必要があります。別のインスタンスを使用すると、その例外が発生します。

于 2009-09-07T16:18:17.770 に答える