Da org.hibernate.NonUniqueObjectException applicazione GWT utilizzando sospensione attraverso gilead

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

  •  05-10-2019
  •  | 
  •  

Domanda

Sto lavorando su un progetto per il college che utilizza GWT, Hibernate e Gilead. In sostanza, per il momento gli utenti dovrebbero essere in grado di aggiungere amici e rimuoverli. Inoltre, un utente può vedere se i suoi amici sono in linea o meno.

Il mio problema è che quando aggiungo un amico che è già legato ad un altro amico, ottengo questo errore:

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

Questa è la mia classe di servizio per la mia applicazione GWT:

public class TestServiceImpl extends PersistentRemoteService implements TestService {

Il mio problema è qui con la mia classe di implementazione del mio servizio in questo metodo, che viene chiamata quando un utente preme il Aggiungi amico pulsante sul lato client.

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

Uno scenario:

user1 , aggiunge utente2 come amico. Questo funziona bene, quindi user3 , aggiunge utente2 e viene generata un'eccezione.

Tutte le idee perché e dove la mia logica sta andando male?

Aggiornamento: Ok, così ho cambiato il mio codice, e ho rimosso tutte le chiamate getCurrentASession() e sostituito con le chiamate openSession() che sono chiuse al momento opportuno, ora l'errore che sto ottenendo è:

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
È stato utile?

Soluzione

Sembra a me come avete 3 utenti con lo stesso nome utente. Come si utilizza uniqueResult(), si indica Hibernate che vi aspettate solo un singolo valore.

Controlla il database o sostituire uniqueResult() con List() per vedere quello che si ottiene indietro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top