Med ett @GeneratedValue-typ-id kan du inte veta det värdet i förväg (innan du faktiskt skriver det). Men när du behåller din Bean kommer id-fältet att fyllas i i den böninstansen och du kan få den utan att behöva göra en extra fråga för den. Med andra ord:
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();
Dessutom, beroende på hur din EntityManager
är konfigurerad, kanske du också först måste utföra transaktionen (manuellt) innan du kan få det ID:t.
Uppdatera enligt kommentar
Om du vill fånga upp och göra något med enheten innan den sparas och/eller uppdateras kan du använda JPA LifeCycle Listeners (om du använder JPA version 2):Hantera JPA livscykelhändelse med hjälp av lyssnare och återuppringningar.
I grund och botten kan du göra en validate()
metod i din böna, annotera den med @PrePersist
och @PreUpdate
och gör valideringen i den (om koden är tom ställ in den till id-värdet)
Uppdatering per andra kommentar
Ja, jag tänkte ärligt talat på det nyss:att om id:t genereras automatiskt kan det fyllas i EFTER pre-persist-händelsen, så att när din pre-persist-kod exekveras så vet du fortfarande inte vad id:t är (du kanske också märker att i exemplet du länkar till ID:t INTE är autogenererat utan ställs in manuellt). Vad du kan göra i det här fallet är att lägga till ett booleskt fält till din enhet (kommenteras med @Transient
så att den inte kvarstår) kallas isCodeEmpty
(vilket är falskt som standard om det inte är specifikt initierat). Sedan i din @PrePersist
annoterad metod du kontrollerar om värdet för kodfältet är tomt och i så fall ställer du in boolean till true. Sedan refaktorerar du ditt setId(...)
metod så att (bortsett från att ställa in id-fältet) kommer den att kontrollera detta boolean, och om det är sant, ställ in värdet på kodfältet till det för id-fältet:
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;
}
}
}