org.hibernate.nonuniqueObjectexception GWTアプリケーション内のGILEADを介したHibernateを使用しています

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

  •  05-10-2019
  •  | 
  •  

質問

私は、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 {

私の問題は、この方法で私のサービスの実装クラスにあります。 友人を追加する クライアント側のボタン。

    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();
}

シナリオ:

ユーザー1 追加します ユーザー2 友人として。これは正常に機能します ユーザー3 追加します ユーザー2 そして、例外がスローされます。

私の論理がうまくいかない理由と場所はありますか?

更新:わかりました、だから私は自分のコードを変更しました、そして私はすべてを削除しました 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
役に立ちましたか?

解決

同じユーザー名を持つ3人のユーザーがいるように見えます。あなたが使用しているように uniqueResult(), 、あなたはあなたが単一の値だけを期待していることを冬眠していると言っています。

データベースを確認するか、交換してください uniqueResult()List() あなたが戻ってきたものを見るために。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top