con un identificador de tipo @GeneratedValue no se puede saber que el valor de antemano (antes de que realmente escribirlo). Sin embargo, una vez que persista su Bean, el campo id se rellenará en esa instancia de bean y podrá obtenerlo sin necesidad de realizar una consulta adicional. En otras palabras:
MyEntiry myEnt = new MyEntity(); //the id field is null now
entityManager.persist(myEnt);//the id field is populated in myEnt now
Long id = myEnt.getId();
También, dependiendo de cómo esté configurado el EntityManager
, es posible que deba también el primer confirmar la transacción (manualmente) antes de poder obtener ese id.
actualización según comentario
Si desea interceptar y hacer algo a la entidad antes de que se guarda y/o actualizado, puede utilizar oyentes LifeCycle JPA (si está utilizando la versión APP 2): Handling JPA lifecycle event using listeners and callbacks .
Básicamente se puede realizar un método validate()
en su frijol, anotar con @PrePersist
y @PreUpdate
y hacer la validación en el mismo (si el código es conjunto vacío al valor de ID)
actualización por segundo comentario
Sí, honestamente pensé en eso hace un momento: que si el ID se genera automáticamente, podría llenarse DESPUÉS del evento de pre-persistencia, de modo que cuando se ejecuta el código de pre-persistencia, aún no se sabe cuál es el ID (También puede observar que en el ejemplo, el enlace al ID NO está autogenerado, sino que se establece manualmente). Lo que puede hacer en este caso es agregar un campo booleano a su entidad (anotado con @Transient
para que no se conserve) llamado isCodeEmpty
(que es falso de manera predeterminada si no se ha inicializado específicamente). Luego, en su método anotado @PrePersist
, comprueba si el valor para el campo de código está vacío y, de ser así, establezca booleano en verdadero. A continuación, refactorizar el método setId(...)
tal que (aparte de establecer el campo id) se comprobará este Booleano, y si se ha ajustado verdad el valor del campo de código a la del campo id:
public class YourEntity {
@Transient
private boolean isCodeEmpty;
public void setId(Whatever id) {
this.id = id;
if(isCodeEmpty) {
this.code = id;
//if necessary:
//this.isCodeEmpty = false;
}
}
@PrePersist
public void validate() {
if(code == null || code.isEmpty()) {
isCodeEmpty = true;
}
}
}
Se podría evitar la @GeneratedValue, utilizar el generador de sí mismo para obtener el valor y la puso a la entidad "manualmente" yo no – SJuan76
Quiero configurarlo manualmente. Si recibo el siguiente valor de id de Oracle y lo configuro para la identificación de la nueva entidad, ¿es racional? – mstzn