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