Die Aktualisierung eines Feldes im JPA-entity
Ich habe eine Entität User
zugeordnet ist, ein system, das Privileg, in eine Funktion. Ich habe eine web-Seite, wo Sie wählen Sie einen Benutzer aus einer drop-down und senden Sie das Formular an den server. Auf der server-Seite, die ich aktualisieren möchten nur ein Feld für die Einheit.
Meiner Entität "Benutzer" werden die Standardwerte für alle Objekte, außer dem Feld, das festgelegt wird, und seine id. Brauche ich, wenn ich eine findById
aktualisieren Sie dann das entsprechende Feld führen Sie dann den Seriendruck oder gibt es eine Möglichkeit zu sagen, die nur update, das Feld?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass wäre die normale Vorgehensweise, außer dass Sie nicht brauchen, um Seriendruck eine verwaltete Entität, lass JPA erkennt die änderungen und aktualisieren Sie Sie automatisch.
Nicht. Aber man könnte ein "short" - version Ihrer
User
(mit nur der Bereich(s) zu aktualisieren). Eine andere Möglichkeit wäre die Verwendung einer Bulk Update-Vorgang aber das ist IMO wirklich kein guter Anwendungsfall. Ich würde nicht diesen Ansatz.Referenz
User
, hat aber nur eine Teilmenge der Spalten. Es sollte unveränderlich sein. Siehe diese Frage/Antwort.@Version
Prüfung entsprechend meinen tests in JPA 2.0 (Hibernate 4.2 IIRC). Ich musste feststellen, trennen Sie, Werte setzen, und dann verschmelzen Sie zu bekommen@Version
überprüfen, aber das erzeugt (eventuell mehrere) überflüssig wählt.JPA 2.1 unterstützen jetzt die update-Kriterien, mit denen Sie teilweise Aktualisierung Entität über
javax.persistence.criteria.CriteriaUpdate<T>
.Javadoc hier.
Beispiel-code:
Mehr details auf JPA 2.1 partielle update hier.
CriteriaUpdate
ist auch keine gute Lösung für dieses problem. Es ist konzipiert für bulk update - Operationen, es ist also unter Umgehung jeder optimistische sperren überprüft. Auch doc sagt: Der persistenzkontext wird nicht synchronisiert mit dem Ergebnis des bulk update.Wenn Sie die Aktualisierung einer Entität, die ausgewählt ist, die durch einen client, haben Sie zwei Möglichkeiten.
1) Wenn der Benutzer ausgewählt ist vertreten in der client-als freistehende Einheit, dann, wenn Sie erhalten die Benutzer-Entität in Ihrem server bean, brauchen Sie nur ordnen Sie das neue Feld Wert ein, und führen Sie dann eine em.merge(selectedUser). Dies hat den negativen Effekt, wenn der Zustand des Benutzers haben sich geändert zwischen Benutzer-Auswahl zu Ihrem server durchführen des Updates, wodurch es zu unerwünschten Ergebnissen.
2) müssen Nur das Formular senden Sie die Benutzer-ID verwenden Sie dann die findById nachschlagen die Benutzer, ändern Sie Ihre Einheit, und übertragen Sie die änderung. Ist dies ein server-managed persistence unit, brauchen Sie nicht zu Begehen.