2010-05-27 49 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()以查看您返回的內容。