Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak poznać id przed zapisaniem obiektu w jpa?

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

}


}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak Java dla OS X 2013-004 wpływa (przerwa) na aplikacje Swing?

  2. Funkcja lub procedura dla klauzuli IN

  3. Film:Wydajność kolumny Oracle 12c IDENTITY w systemie RAC

  4. Liczba piątków między dwiema datami

  5. jak używać xmltable w Oracle?