Z identyfikatorem typu @GeneratedValue nie możesz znać tej wartości z góry (przed jej napisaniem). Jednak po utrwaleniu fasoli pole id zostanie wypełnione w tej instancji fasoli i można je uzyskać bez konieczności wykonywania dodatkowego zapytania. Innymi słowy:
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();
Ponadto, w zależności od tego, jak Twój EntityManager
jest skonfigurowany, być może będziesz musiał najpierw zatwierdzić transakcję (ręcznie), zanim uzyskasz ten identyfikator.
Aktualizuj zgodnie z komentarzem
Jeśli chcesz przechwycić i zrobić coś na encji przed jej zapisaniem i/lub aktualizacją, możesz użyć odbiorników JPA LifeCycle Listeners (jeśli używasz JPA w wersji 2):Obsługa zdarzeń cyklu życia JPA za pomocą detektorów i wywołań zwrotnych.
Zasadniczo możesz zrobić validate()
w swojej fasoli, dodaj do niej adnotację @PrePersist
i @PreUpdate
i wykonaj w nim walidację (jeśli kod jest pusty, ustaw go na wartość id)
Aktualizacja za drugi komentarz
Tak, szczerze właśnie o tym pomyślałem:jeśli identyfikator jest generowany automatycznie, może zostać wypełniony PO zdarzeniu pre-persist, tak że po wykonaniu kodu pre-persist nadal nie wiesz, jaki jest identyfikator (możesz również zauważyć, że w przykładzie link do identyfikatora NIE jest generowany automatycznie, ale ustawiany ręcznie). W tym przypadku możesz dodać pole logiczne do swojej encji (z adnotacją @Transient
więc nie zostanie utrwalony) o nazwie isCodeEmpty
(co jest domyślnie fałszywe, jeśli nie zostało konkretnie zainicjowane). Następnie w swoim @PrePersist
metoda z adnotacjami sprawdzasz, czy wartość pola kodu jest pusta, a jeśli tak, ustawiasz wartość logiczną na true. Następnie dokonujesz refaktoryzacji swojego setId(...)
metoda taka, że (oprócz ustawienia pola id) sprawdzi tę wartość logiczną, a jeśli prawda ustawi wartość pola kodu na wartość pola 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;
}
}
}