Con un tipo @GeneratedValue ID non si può sapere che il valore in anticipo (prima realmente scriverlo). Tuttavia, una volta persistente il bean, il campo id verrà popolato in tale istanza di bean e sarà possibile ottenerlo senza dover eseguire una query aggiuntiva. 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 la vostra EntityManager
è configurato, potrebbe essere necessario anche il primo commit della transazione (manualmente) prima di poter ottenere che id.
aggiornamento come da commento
Se si vuole intercettare e fare qualcosa per l'entità prima di essere salvato e/o aggiornato, è possibile utilizzare JPA ascoltatori LifeCycle (se si sta utilizzando JPA versione 2): Handling JPA lifecycle event using listeners and callbacks .
Fondamentalmente si può fare un metodo validate()
nel vostro fagioli, annotare con @PrePersist
e @PreUpdate
e fare la convalida in esso (se il codice è insieme vuoto per il valore di id)
Aggiornamento per secondo commento
Sì, ho onestamente pensato a questo solo ora: che se l'id è generato automaticamente, potrebbe essere popolato DOPO l'evento pre-persistente, in modo tale che quando viene eseguito il codice pre-persistenza non si sa ancora cosa sia l'id (si può notare anche che nell'esempio che si collega all'ID NON viene generato automaticamente ma impostato manualmente). Quello che puoi fare in questo caso è aggiungere un campo booleano alla tua entità (annotata con @Transient
in modo che non venga mantenuta) chiamata isCodeEmpty
(che è falsa di default se non specificatamente inizializzata). Quindi nel metodo annotato @PrePersist
si controlla se il valore per il campo codice è vuoto e, in tal caso, impostare il valore booleano su true. Poi si refactoring il metodo setId(...)
tale che (a parte l'impostazione del campo id) che controllerà questo booleana, e se è vero insieme il valore del campo codice a quella 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;
}
}
}
fonte
2012-10-05 09:02:09
Si potrebbe evitare la @GeneratedValue, utilizzare il generatore di se stessi per ottenere il valore e impostarlo su entità "manualmente" – SJuan76
I dont vuoi impostarlo manualmente sull'entità. se ottengo il prossimo valore per id da oracle e lo imposto su id di una nuova entità, è razionale? – mstzn