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

一个场景:

user1user2添加为好友。这工作正常,然后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 回答