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