1

私は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
4

1 に答える 1

2

同じユーザー名のユーザーが3人いるようです。を使用しているuniqueResult()ので、Hibernateに単一の値のみを期待していることを伝えています。

データベースを確認するか、に置き換えuniqueResult()List()、何が返されるかを確認してください。

于 2010-05-28T14:40:33.583 に答える