Frage 1
- Die
merge
Methode muss auf einem abgelöst Einheit aufgerufen werden.
- Die
merge
-Methode gibt das zusammengefügte Objekt an an den EntityManager zurück.
Was bedeutet das?
Eine Entität wird getrennt, sobald der EntityManager, den Sie zum Abrufen verwenden, geschlossen wird. (d. h. die meiste Zeit, weil Sie es in einer vorherigen Transaktion abrufen).
In Ihrem zweiten Code-Beispiel: Benutzer ist angehängt (weil Sie es gerade holen) und so Aufruf Merge ist nutzlos. (BTW: es ist nicht getReference
aber find
)
In Ihrem ersten Beispiel: Wir kennen nicht den Zustand des Benutzers (losgelöstes Wesen oder nicht?). Wenn es losgelöst ist, ist es sinnvoll, merge
zu rufen, aber vorsichtig, dass merge
sein Objekt nicht als ein Argument übergeben ändern. So, hier ist meine Version Ihrer ersten Probe:
/**
* @param user : a detached entity
* @return : the attached updated entity
**/
public User updateUserName(User user, String name) {
user.setName(name);
user.setChangeDate(new Date());
return em.merge(user);
}
Frage 2
Vielleicht sind einige Code-Beispiel zu erklären, was Sie von JPA-Handler bedeuten können uns Ihr Anliegen zu verstehen helfen. Wie auch immer, ich werde versuchen dir zu helfen.
Wenn Sie einen persistenten Benutzer, und Sie müssen eine neue Gruppe erstellen und mit dem persistenten Benutzer zuzuordnet:
User user = em.find(User.class, userId);
Group group = new Group();
...
em.persist(group);
user.addToGroups(group);
group.addToUsers(user); //JPA won't update the other side of the relationship
//so you have to do it by hand OR being aware of that
Wenn Sie einen persistenten Benutzer und eine persistente Gruppe und Sie müssen sie assoziieren :
User user = em.find(User.class, userId);
Group group = em.find(Group.class, groupId);
...
user.addToGroups(group);
group.addToUsers(user);
Allgemeine Überlegungen
Die beste Praktiken in Bezug auf all dies hängt wirklich davon ab, dass Sie die Transaktionen (und damit den Lebenszyklus des EntityManagers) im Vergleich zum Lebenszyklus Ihrer Objekte verwalten.
Die meiste Zeit: ein EntityManager ist ein wirklich kurzlebiges Objekt. Auf der anderen Seite können Ihre Geschäftsobjekte länger leben und Sie müssen daher Zusammenführen aufrufen (und darauf achten, dass die Zusammenführung das Objekt, das im Argument übergeben wird, nicht ändert !!!).
Sie können entscheiden, Ihre Geschäftsobjekte in derselben Transaktion (d. H. Mit demselben EntityManager) abzurufen und zu ändern: es bedeutet viel mehr Datenbankzugriff und diese Strategie muss aus Leistungsgründen in der Regel mit einem Second-Level-Cache kombiniert werden. Aber in diesem Fall müssen Sie die Zusammenführung nicht aufrufen.
Ich hoffe diese Hilfe.
Siehe http://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge – GKislin