2010-05-27 69 views
1

我正在使用GWT,Hibernate和Gilead的大学项目。基本上目前用户应该能够添加好友并将其删除。另外,用户可以看到他或她的朋友是否在线。org.hibernate.NonUniqueObjectException在通过gilead使用休眠的GWT应用程序中

我的问题是,当我再补充一点已经与另一位朋友的朋友,我得到这个错误:

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

一个场景:

USER1增加user2的为好友。这工作正常,然后用户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 
+0

你的Hibernate Session的范围是什么/它在哪里管理?在给出的例子中,你使用了getCurrentSession()。前端是否有打开新会话的过滤器?在许多用户中共享一个永无休止的休眠会话是一个灾难的公式:) – Affe 2010-05-27 19:56:17

+0

我没有在前端的过滤器,我真的不知道它是什么,可以给我一些洞见,了解如何不共享会话。 (我真的不知道我是不是)。我只打开一个会话发送一个用户到客户端,这允许他们登录,然后打开一个会话来保存用户注销或更新内容。 一个关于如何不分享会议的头像会很棒? – molleman 2010-05-28 00:19:39

+0

我也在用一个hibernateUtil类来管理会话,这个类似于这个例子中的一个,使用gilead进行一些修改,http://code.google.com/webtoolkit/articles/using_gwt_with_hibernate.html – molleman 2010-05-28 00:22:52

回答

2

它看起来像我有3个用户具有相同的用户名。当你使用uniqueResult()时,你告诉Hibernate你只有一个值。

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