2012-03-10 43 views
27

Estoy buscando una forma inteligente y fácil de leer para obtener la identificación de una entidad persistente usando JPA. La identificación es Integer.Cómo obtener Id de la última entidad persistente usando JPA

Se podría pensar en las siguientes soluciones:

  1. Sin utilizar GeneratedValue estrategia. Esto requiere buscar una identificación gratis antes de persistir, luego ponerla en la entidad para ser persistente: engorrosa, pero funciona.
  2. Con una estrategia GeneratedValue. El proveedor de persistencia se ocupará de la generación de id. Esto parece más inteligente, pero ¿cómo obtener la identificación?

Véase más abajo para solución de 2

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

Esto imprime identidad nulo!

¿Alguna sugerencia? Estoy usando MySql, EclipseLink, pero necesito una solución portátil.

Respuesta

53

persist no garantiza la generación de la ID. Se garantiza que la ID se genere solo en tiempo de descarga. Así que si realmente necesita el ID antes de que termine la transacción (y el gestor de la entidad es, pues, enrojecida), llamar a flush() explícitamente para obtener el ID:

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

@JB Nizet, ¿cómo puedo obtener una identificación antes de persistir '() 'método? Lo estoy esperando porque me gustaría cambiar el formato de identificación personalizado? – CycDemo

+1

@CycDemo: no puede, a menos que lo genere usted mismo. –

+0

@JBNizet ¿Dónde está la fuente de la declaración "persistir no está garantizado para generar el ID"? En la especificación JPS (JSR), leí las siguientes dos declaraciones (Capítulo 3.2): - Una instancia de entidad administrada es una instancia con una identidad persistente - La semántica de la operación persist, aplicada a una entidad X es la siguiente: X es una nueva entidad, se vuelve administrada. ... * Si interpreto esa palabra por palabra, diría que la especificación exige que el Id esté configurado después de llamar a persist() *. Ese es también el comportamiento de Hibernate. – jbandi

Cuestiones relacionadas