Utilizzare executeUpdate()
su Query
API è più veloce perché ignora il contesto persistente. Tuttavia, il contesto persistente by-pass causerebbe lo stato di istanza nella memoria e i valori effettivi di tale record nel DB non sono sincronizzati.
consideri il seguente esempio:
Employee employee= (Employee)entityManager.find(Employee.class , 1);
entityManager
.createQuery("update Employee set name = \'xxxx\' where id=1")
.executeUpdate();
Dopo il lavaggio, il nome nel DB viene aggiornata al nuovo valore, ma l'istanza dipendente nella memoria conserva ancora il valore originale Avete chiamare entityManager.refresh(employee)
per ricaricare il nome aggiornato dal DB all'istanza dipendente. Sembra strano se i codici devono ancora manipolare l'istanza dipendente dopo lo svuotamento, ma si dimentica di aggiornare() l'istanza dipendente in quanto l'istanza dipendente contiene ancora i valori originali.
Normalmente, executeUpdate()
viene utilizzato nel processo di aggiornamento di massa in quanto è più veloce a causa bypassando il contesto persistente
Il modo giusto per aggiornare un'entità è che è sufficiente impostare le proprietà che si desidera aggiornato attraverso i setter e Lascia che l'JPA generi l'aggiornamento SQL per te durante lo svuotamento invece di scriverlo manualmente.
Employee employee= (Employee)entityManager.find(Employee.class ,1);
employee.setName("Updated Name");
fonte
2011-11-29 08:50:56
@Ken Chan, 'entityManager.find (Employee.class, 1)' e 'employee.setName (" Nome aggiornato) 'causa due query: seleziona e aggiorna, e se vogliamo una sola query quando aggiornamento entità? È possibile? – inherithandle
Odio il modo in cui gli aggiornamenti vengono apportati in JPA. Può causare molti aggiornamenti accidentali ed effetti collaterali. A volte non si sa nemmeno che si sta facendo un aggiornamento. – ceklock
Un modo per aggiornare tutte le proprietà con un nuovo oggetto anziché eseguirne uno alla volta? –