sql >> Databáze >  >> RDS >> Oracle

Jak poznám id před uložením objektu do jpa

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;
 }

}


}


  1. Jak převedu celé číslo na řetězec jako součást dotazu PostgreSQL?

  2. 10 tipů pro Microsoft Access pro vytváření vybraných dotazů

  3. Jak se připojit k první řadě

  4. Výběr řádků uspořádaných podle některého sloupce a odlišných v jiném