我正在研究一个使用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
答案 0 :(得分:2)
在我看来,您有3个用户具有相同的用户名。当您使用uniqueResult()
时,您告诉Hibernate您只期望一个值。
检查您的数据库或将uniqueResult()
替换为List()
以查看您的回复。