sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo sé la identificación antes de guardar un objeto en jpa?

Con una identificación de tipo @GeneratedValue, no puede saber ese valor por adelantado (antes de escribirlo). Sin embargo, una vez que persista su Bean, el campo de identificación se completará 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();

Además, dependiendo de cómo su EntityManager está configurado, es posible que primero deba confirmar la transacción (manualmente) antes de poder obtener esa identificación.

Actualizar según comentario

Si desea interceptar y hacer algo con la entidad antes de que se guarde o actualice, puede usar JPA LifeCycle Listeners (si está usando JPA versión 2):Manejo de eventos de ciclo de vida de JPA usando oyentes y devoluciones de llamada.

Básicamente puedes hacer un validate() en su bean, anótelo con @PrePersist y @PreUpdate y haga la validación en él (si el código está vacío, configúrelo en el valor de id)

Actualizar por segundo comentario

Sí, honestamente, acabo de pensar en eso ahora:que si la identificación se genera automáticamente, podría completarse DESPUÉS del evento de persistencia previa, de modo que cuando se ejecuta su código de persistencia previa, todavía no sabe cuál es la identificación. (También puede notar que en el ejemplo que vincula a la identificación NO se genera automáticamente 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 persista) llamado isCodeEmpty (que es falso por defecto si no se inicializa específicamente). Luego en tu @PrePersist método anotado, verifica si el valor del campo de código está vacío y, de ser así, establece el valor booleano en verdadero. Luego refactorizas tu setId(...) método tal que (además de establecer el campo de identificación) verificará este valor booleano y, si es verdadero, establecerá el valor del campo de código al del campo de identificación:

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;
 }

}


}