Aus dem Buch Pro EJB3 JPA zu aktualisieren:merge vs findet Entitäten JPA
Die häufigste Strategie zu handhaben diese (-update entities-) in Java EE-Anwendung, die JPA verwendet wird, um die Ergebnisse zu platzieren die Veränderungen in freistehenden Entitätsinstanzen und fusioniert die geplanten Operationen in einen Persistenzkontext, so dass sie in die Datenbank geschrieben werden können
Beispiel: die emp param ist ein freistehendes e ntity
@Stateless
public class EmployeeServiceBean {
@PersistenceContext
EmtityManager em;
public void updateEmployee(Employee emp){
if(em.find(Employee.class, emp.getId()) == null){
throw new IllegalArgumentException("Unknown Employee id")
}
em.merge(emp);
}
}
Dann sagt:
Wenn die Menge an Informationen udated ist sehr klein ist, wir das freistehende Objekt zu vermeiden und verschmelzen() Betrieb vollständig von der verwalteten Version lokalisiert und manuell kopieren die Veränderungen hinein.
Beispiel: Hier die emp angebracht ist
public void updateEmployee(int id, String newName, long newSalary) {
Employee emp = em.find(Employee.class, id);
if(emp==null){
throw new IllegalArgumentException("Unknown Employee id")
}
emp.setEmpName(newName);
emp.setSalary(newSalary);
}
So, sieht aus wie für kleine Updates und erstellen Operationen die Strategie find()
und dann neue Werte eins nach dem anderen ist bequem. Aber !, für große Updates von Daten (d. H. Sammlungen) ist bevorzugt, haben Sie eine losgelöste Entität und alle ihre Beziehungen (mit CascadeType.Merge) und tun Sie eine große merge()
.
OK, aber warum?
Der Datenbankzugriff ist für größere Objekte teuer und sollte daher im getrennten Modus ausgeführt werden, um sicherzustellen, dass Sie keine unnötigen Aufrufe an das Back-End tätigen. – hd1
anstelle von "emp.setEmpName (newName);" das Feld nacheinander setzen. Kann es gemacht werden durch "emp = new Employee (// Felder einrichten);"? @Please lassen Sie mich –
ja, in der Tat Setter/Getter sind optional von der Spezifikation, können Sie Parameter auf den Konstruktor oder mit einer fließenden API initialisieren und JPA wird die Werte finden. Verwenden Sie es mit Vorsicht;) – Sergio