Oracle
 sql >> Database >  >> RDS >> Oracle

Come faccio a conoscere l'id prima di salvare un oggetto in jpa

Con un ID di tipo @GeneratedValue non puoi conoscere quel valore in anticipo (prima di scriverlo effettivamente). Tuttavia, una volta che persisti il ​​tuo Bean, il campo id verrà popolato in quell'istanza del bean e puoi ottenerlo senza dover eseguire una query aggiuntiva per esso. In altre parole:

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();

Inoltre, a seconda di come il tuo EntityManager è configurato, potrebbe essere necessario anche prima eseguire il commit della transazione (manualmente) prima di poter ottenere quell'ID.

Aggiorna come da commento

Se desideri intercettare e fare qualcosa all'entità prima che venga salvata e/o aggiornata, puoi utilizzare JPA LifeCycle Listener (se stai utilizzando JPA versione 2):gestione dell'evento del ciclo di vita JPA utilizzando listener e callback.

Fondamentalmente puoi fare un validate() metodo nel tuo bean, annotalo con @PrePersist e @PreUpdate ed esegui la convalida al suo interno (se il codice è vuoto impostalo sul valore di id)

Aggiornamento al secondo commento

Sì, onestamente ci ho pensato solo ora:che se l'id è generato automaticamente, potrebbe essere popolato DOPO l'evento di pre-persistenza, in modo tale che quando il tuo codice di pre-persistenza viene eseguito non sai ancora quale sia l'id (potresti anche notare che nell'esempio il link all'id NON è autogenerato ma impostato manualmente). Quello che puoi fare in questo caso è aggiungere un campo booleano alla tua entità (annotata con @Transient quindi non verrà persistente) chiamato isCodeEmpty (che è false per impostazione predefinita se non è stato inizializzato in modo specifico). Quindi nel tuo @PrePersist metodo annotato per verificare se il valore per il campo codice è vuoto e, in tal caso, impostare il valore booleano su true. Quindi refactoring del tuo setId(...) metodo tale che (oltre a impostare il campo id) controlli questo booleano e, se true, imposta il valore del campo codice su quello 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;
 }

}


}