org.hibernate.NonUniqueObjectException Dentro de la aplicación GWT usando Hibernate través de Gilead

StackOverflow https://stackoverflow.com/questions/2924259

  •  05-10-2019
  •  | 
  •  

Pregunta

Estoy trabajando en un proyecto para la universidad que utiliza GWT, Hibernate y Gilead. Básicamente por el momento, los usuarios deben ser capaces de agregar amigos y eliminarlos. Además, un usuario puede ver si sus amigos están conectados o no.

Mi problema es que cuando agrego un amigo que ya está relacionado con otro amigo, me sale este error:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value     was already associated with the session: [com.example.client.YFUser#4]

Esta es mi clase de servicio para mi aplicación GWT:

public class TestServiceImpl extends PersistentRemoteService implements TestService {

Mi problema es con mi clase de implementación de mi servicio en este método, que se llama cuando el usuario pulsa el añadir amigo botón en el lado del cliente.

    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();
}

Un escenario:

usuario1 añade usuario2 como un amigo. Esta bien funciona, entonces User3 añade usuario2 y la excepción.

Cualquier idea por qué y dónde está mi lógica va mal?

Actualización: Ok, así que he cambiado mi código, y he eliminado todas las llamadas getCurrentASession() y reemplazado con llamadas openSession() que se cierran en el momento apropiado, ahora el error que estoy consiguiendo es:

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
¿Fue útil?

Solución

Me parece que usted tiene 3 usuarios con el mismo nombre de usuario. Como se está utilizando uniqueResult(), está indicando a Hibernate que usted está esperando un solo valor.

Compruebe su base de datos o reemplazar uniqueResult() con List() para ver lo que hay detrás.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top