Tengo una simple entidad JPA que utiliza un generada long
"ID" como su clave principal:establecer la APP un @GeneratedValue @Id
@Entity
public class Player {
private long id;
protected Player() {
// Do nothing; id defaults to 0L
}
@GeneratedValue
@Id
public long getId() {
return id;
}
protected void setId(final long id) {
this.id = id;
}
// Other code
}
En un cierto punto en el ciclo de vida de un objeto de este tipo, el JPA debe llamar al setId()
para registrar el valor de ID generado. Mi pregunta es, cuando sucede esto, y donde está la documentación que dice esto. Revisé la Especificación de JPA y no puedo encontrar una declaración clara.
La especificación dice APP (énfasis añadido):
Una instancia de la entidad gestionada es una instancia con un persistente identidad que actualmente está asociada con un contexto de persistencia.
es que intentar decir que el objeto debe ser administrado a tener su @Id
significativa? La documentación para EntityManager.persist()
dice (énfasis añadido) hace "una instancia administrada y persistente", ¿significa eso que el @Id
está establecido por ese método? ¿O no será hasta que llame al EntityTransaction.commit()
?
Cuando se establece @Id
puede ser diferente para diferentes proveedores de JPA, y quizás para diferentes estrategias de generación. Pero, ¿cuál es la suposición más segura (portátil, que cumpla con las especificaciones) que puede hacer sobre el primer punto en el ciclo de vida que se ha configurado?
Parece algo que podría establecerse fácilmente con la depuración. – skaffman
Apuesto a que si las especificaciones no dicen explícitamente * cuándo * se debe generar el @Id, entonces los proveedores deben decidirlo. –
@Raedwald: la depuración le dirá cómo funciona JPA internamente, y le dirá qué bits son específicos del dialecto. – skaffman