org.hibernate.NonUniqueObjectException Innerhalb GWT-Anwendung mit Hibernate durch gilead

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

  •  05-10-2019
  •  | 
  •  

Frage

Ich arbeite für die Hochschule an einem Projekt, GWT, Hibernate und Gilead verwendet. Im Grunde genommen für den Moment Benutzer sollten in der Lage sein, Freunde hinzuzufügen und zu entfernen. Außerdem kann ein Benutzer sehen, wenn seine oder ihre Freunde online sind oder nicht.

Mein Problem ist, dass wenn ich einen Freund hinzufügen, die bereits an einem anderen Freund verwendet ist, ich diesen Fehler:

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

Das ist meine Dienstklasse für meine GWT-Anwendung:

public class TestServiceImpl extends PersistentRemoteService implements TestService {

Mein Problem ist hier mit meiner Implementierungsklasse meines Dienstes in dieser Methode, die aufgerufen wird, wenn ein Benutzer das drückt Freund hinzufügen -Taste auf der Client-Seite.

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

Ein Szenario:

user1 fügt benutzer2 als Freund. Dies funktioniert gut, dann user3 fügt benutzer2 und die Ausnahme ausgelöst wird.

Irgendwelche Ideen, warum und wo meine Logik nicht in Ordnung ist?

Update: Ok, so dass ich meinen Code geändert haben, und ich habe alle getCurrentASession() Anrufe entfernt und mit openSession() Anrufe ersetzt, die an der entsprechenden Stelle geschlossen werden, jetzt der Fehler Ich erhalte ist:

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
War es hilfreich?

Lösung

Es scheint mir, wie Sie 3 Benutzer haben mit dem gleichen Benutzernamen an. Wie Sie uniqueResult() verwenden, werden Sie sagen, Hibernate, dass Sie nur einen einzigen Wert erwarten.

Überprüfen Sie Ihre Datenbank oder ersetzen uniqueResult() mit List() zu sehen, was Ihnen in Verbindung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top