Я работаю над проектом для колледжа, который использует 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 {
Моя проблема в том, что мой класс реализации моего сервиса в этом методе вызывается, когда пользователь нажимает кнопку добавить друга на стороне клиента.
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