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
你的Hibernate Session的範圍是什麼/它在哪裏管理?在給出的例子中,你使用了getCurrentSession()。前端是否有打開新會話的過濾器?在許多用戶中共享一個永無休止的休眠會話是一個災難的公式:) – Affe 2010-05-27 19:56:17
我沒有在前端的過濾器,我真的不知道它是什麼,可以給我一些洞見,瞭解如何不共享會話。 (我真的不知道我是不是)。我只打開一個會話發送一個用戶到客戶端,這允許他們登錄,然後打開一個會話來保存用戶註銷或更新內容。 一個關於如何不分享會議的頭像會很棒? – molleman 2010-05-28 00:19:39
我也在用一個hibernateUtil類來管理會話,這個類似於這個例子中的一個,使用gilead進行一些修改,http://code.google.com/webtoolkit/articles/using_gwt_with_hibernate.html – molleman 2010-05-28 00:22:52