エンティティを削除するとエラーがスローされます。一度に 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) を表す別のオブジェクトに変更されたかのように動作します。私が間違っていることについてのヒントはありますか?