S ID typu @GeneratedValue nemůžete tuto hodnotu znát předem (než ji skutečně napíšete). Jakmile však svůj Bean zachováte, pole id se vyplní v této instanci beanu a můžete jej získat, aniž byste pro něj museli dělat další dotaz. Jinými slovy:
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();
Také v závislosti na tom, jak váš EntityManager
je nakonfigurováno, možná budete muset také nejprve potvrdit transakci (ručně), než získáte toto ID.
Aktualizovat podle komentáře
Pokud chcete zachytit a něco udělat s entitou před jejím uložením a/nebo aktualizací, můžete použít JPA LifeCycle Listeners (pokud používáte JPA verze 2):Zpracování události životního cyklu JPA pomocí posluchačů a zpětných volání.
V zásadě můžete provést validate()
metodu ve vašem beanu, označte ji pomocí @PrePersist
a @PreUpdate
a proveďte v něm ověření (pokud je kód prázdný, nastavte jej na hodnotu id)
Aktualizace za 2. komentář
Ano, upřímně mě to právě teď napadlo:že pokud je id vygenerováno automaticky, může se vyplnit PO události pre-persist, takže když se spustí váš kód pre-persist, stále nevíte, co je to id (můžete si také všimnout, že v příkladu, na který odkazujete, NENÍ automaticky vygenerováno, ale nastaveno ručně). V tomto případě můžete do své entity přidat booleovské pole (označené @Transient
takže to nebude trvalé) s názvem isCodeEmpty
(což je ve výchozím nastavení nepravda, pokud není specificky inicializováno). Poté ve vašem @PrePersist
anotovanou metodou, zkontrolujete, zda je hodnota pole kódu prázdná, a pokud ano, nastavte boolean na hodnotu true. Poté refaktorujete svůj setId(...)
metodu tak, že (kromě nastavení pole id) zkontroluje tento boolean, a pokud je true, nastaví hodnotu pole kódu na hodnotu pole 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;
}
}
}