org.hibernate.NonUniqueObjectException Dans l'application GWT à l'aide mise en veille prolongée par Gilead

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

  •  05-10-2019
  •  | 
  •  

Question

Je travaille sur un projet pour le collège qui utilise GWT, Hibernate et Gilead. Fondamentalement, pour les utilisateurs actuellement devraient être en mesure d'ajouter des amis et de les supprimer. En outre, un utilisateur peut voir si ses amis sont en ligne ou non.

Mon problème est que quand j'ajoute un ami qui est déjà lié à un autre ami, je reçois cette erreur:

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

Ceci est ma classe de service pour mon application GWT:

public class TestServiceImpl extends PersistentRemoteService implements TestService {

Mon problème est ici avec ma classe de mise en œuvre de mon service dans cette méthode, qui est appelée lorsqu'un utilisateur appuie sur la touche ajouter ami bouton sur le côté 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();
}

Scénario A:

utilisateur1 ajoute utilisateur2 comme un ami. Cela fonctionne très bien, puis user3 ajoute utilisateur2 et l'exception est levée.

Toutes les idées pourquoi et où ma logique va mal?

Mise à jour: Ok, donc je l'ai changé mon code, et je l'ai supprimé tous les appels getCurrentASession() et remplacés par des appels openSession() qui sont fermés au moment approprié, maintenant l'erreur que je reçois est:

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
Était-ce utile?

La solution

Il me semble que vous avez 3 utilisateurs avec le même nom d'utilisateur. Comme vous utilisez uniqueResult(), vous dites Hibernate que vous attendez qu'une seule valeur.

Vérifiez votre base de données ou remplacer uniqueResult() avec List() pour voir ce que vous obtenez en retour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top