Med et @GeneratedValue type id kan du ikke kende denne værdi på forhånd (før du rent faktisk skriver den). Men når du fortsætter med din Bean, vil id-feltet blive udfyldt i den bean-forekomst, og du kan få den uden at skulle lave en ekstra forespørgsel efter den. Med andre 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();
Også afhængigt af hvordan din EntityManager
er konfigureret, skal du muligvis også først udføre transaktionen (manuelt), før du kan få det id.
Opdater i henhold til kommentar
Hvis du vil opsnappe og gøre noget ved enheden, før den gemmes og/eller opdateres, kan du bruge JPA LifeCycle Listeners (hvis du bruger JPA version 2):Håndtering af JPA livscyklushændelser ved hjælp af lyttere og tilbagekald.
Grundlæggende kan du lave en validate()
metode i din bønne, annoter den med @PrePersist
og @PreUpdate
og lav valideringen i den (hvis koden er tom, indstil den til id's værdi)
Opdatering pr. 2. kommentar
Ja, jeg tænkte ærligt lige på det lige nu:at hvis id'et er automatisk genereret, kan det blive udfyldt EFTER pre-persist-hændelsen, sådan at når din pre-persist-kode udføres, ved du stadig ikke hvad id'et er (du kan også bemærke, at i eksemplet, du linker til id'et IKKE er autogenereret, men indstillet manuelt). Hvad du kan gøre i dette tilfælde er at tilføje et boolesk felt til din enhed (annoteret med @Transient
så det vil ikke blive ved med) kaldet isCodeEmpty
(som er falsk som standard, hvis det ikke er specifikt initialiseret). Derefter i din @PrePersist
annoteret metode kontrollerer du om værdien for kodefeltet er tomt, og hvis det er tilfældet, skal du sætte boolean til sand. Derefter refaktoriserer du din setId(...)
metode sådan, at den (bortset fra at indstille id-feltet) vil kontrollere denne boolean, og hvis den er sand, indstilles værdien af kodefeltet til værdien af id-feltet:
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;
}
}
}