2012-03-10 7 views
27

Sto cercando un modo intelligente e facilmente leggibile per ottenere l'identità di un'entità persistente utilizzando JPA. L'ID è un Integer.Come ottenere l'ID dell'ultima entità persistente utilizzando JPA

Si potrebbe pensare delle seguenti soluzioni:

  1. Senza utilizzare GeneratedValue strategia. Ciò richiede la ricerca di un id libero prima di persistere, quindi di inserirlo nell'entità da perseguire: ingombrante, ma funziona.
  2. Con una strategia GeneratedValue. Il provider di persistenza si prenderà cura della generazione di ID. Questo sembra più intelligente, ma come ottenere l'ID?

Vedere sotto per soluzione 2

MyEntity en = new MyEntity(); 
en.setName("My name"); 
em.persist(en); 
System.out.println(en.getId()); 

Questo stampa un id nulla!

Qualche suggerimento? Sto usando MySql, EclipseLink, ma ho bisogno di una soluzione portatile.

risposta

53

persist non è garantito per generare l'ID. L'ID è garantito per essere generato solo al tempo di irrigazione. Quindi, se si ha realmente bisogno l'ID prima che la transazione si conclude (e il gestore entità è quindi lavata), chiamare flush() esplicitamente per ottenere l'ID:

MyEntity en = new MyEntity(); 
en.setName("My name"); 
em.persist(en); 
em.flush(); 
System.out.println(en.getId()); 
+0

@JB Nizet, come posso ottenere id prima 'persistono () 'metodo? Non vedo l'ora perché vorrei cambiare il formato ID personalizzato? – CycDemo

+1

@CycDemo: non puoi, a meno che tu non lo generi da solo. –

+0

@JBNizet Dove è la fonte dell'istruzione "persist non è garantito generare l'ID"? In JPS Spec (JSR) ho letto le seguenti due dichiarazioni (capitolo 3.2): - Un'istanza entità gestita è un'istanza con un'identità persistente - La semantica dell'operazione persist, applicata a un'entità X è la seguente: Se X è una nuova entità, diventa gestita. ... * Se interpreto quella parola per parola, direi che la specifica richiede che l'Id sia impostato dopo aver chiamato persist() *. Questo è anche il comportamento di Hibernate. – jbandi

Problemi correlati