org.hibernate.NonUniqueObjectException在GWT应用程序中使用hibernate通过gilead

时间:2010-05-27 19:32:36

标签: java hibernate gwt gilead

我正在研究一个使用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

1 个答案:

答案 0 :(得分:2)

在我看来,您有3个用户具有相同的用户名。当您使用uniqueResult()时,您告诉Hibernate您只期望一个值。

检查您的数据库或将uniqueResult()替换为List()以查看您的回复。