私はGWT、Hibernate、Gileadを使用する大学のプロジェクトに取り組んでいます。基本的に今のところ、ユーザーは友達を追加したり削除したりできるはずです。また、ユーザーは自分の友達がオンラインかどうかを確認できます。
私の問題は、すでに別の友達に関連している友達を追加すると、次のエラーが発生することです。
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.example.client.YFUser#4]
これは私のgwtアプリケーションのサービスクラスです:
public class TestServiceImpl extends PersistentRemoteService implements TestService {
私の問題は、ユーザーがadd friendクライアント側のボタンを押すと呼び出される、このメソッドのサービスの実装クラスにあります。
public void addYFUserFriend(String userName){
//this retrieves the current user
YFUser user = (YFUser)getSession().getAttribute(SESSION_USER);
Session session = com.example.server.HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
YFUser friend = (YFUser) session.createQuery("select u FROM YFUser u where u.username = :username").setParameter("username", userName).uniqueResult();
System.out.println("user " + friend.getUsername() + " Found");
user.getFriends().add(friend);
friend.getBefriended().add(user);
session.update(user);
session.update(friend);
session.getTransaction().commit();
}
シナリオ:
user1はuser2を友達として追加します。これは正常に機能し、user3がuser2を追加すると、例外がスローされます。
私の論理がどこで間違っているのか、何か考えはありますか?
更新:わかりました。コードを変更し、すべての呼び出しを削除して、適切な時点で閉じられたgetCurrentASession()
呼び出しに置き換えました。現在、発生しているエラーは次のとおりです。openSession()
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract void com.example.client.TestService.addYFUserFriend(java.lang.String)' threw an unexpected exception: org.hibernate.NonUniqueResultException: query did not return a unique result: 3