Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Woher weiß ich die ID, bevor ich ein Objekt in jpa speichere

Mit einer @GeneratedValue-Typ-ID können Sie diesen Wert nicht im Voraus kennen (bevor Sie ihn tatsächlich schreiben). Sobald Sie jedoch Ihr Bean beibehalten, wird das ID-Feld in dieser Bean-Instanz ausgefüllt und Sie können es abrufen, ohne eine zusätzliche Abfrage dafür durchführen zu müssen. Mit anderen Worten:

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();

Auch abhängig davon, wie Ihr EntityManager konfiguriert ist, müssen Sie möglicherweise auch zuerst die Transaktion (manuell) festschreiben, bevor Sie diese ID erhalten können.

Aktualisierung gemäß Kommentar

Wenn Sie die Entität abfangen und etwas mit ihr tun möchten, bevor sie gespeichert und/oder aktualisiert wird, können Sie JPA LifeCycle Listeners verwenden (wenn Sie JPA Version 2 verwenden):Handling JPA lifecycle event using listeners and callbacks.

Grundsätzlich kann man ein validate() machen -Methode in Ihrer Bean, kommentieren Sie sie mit @PrePersist und @PreUpdate und führen Sie die Validierung darin durch (wenn der Code leer ist, setzen Sie ihn auf den Wert von id)

Aktualisierung pro 2. Kommentar

Ja, daran habe ich ehrlich gesagt gerade gedacht:Wenn die ID automatisch generiert wird, wird sie möglicherweise NACH dem Pre-Persist-Ereignis ausgefüllt, sodass Sie bei der Ausführung Ihres Pre-Persist-Codes immer noch nicht wissen, was die ID ist (Möglicherweise bemerken Sie auch, dass in dem Beispiel der Link zur ID NICHT automatisch generiert, sondern manuell festgelegt wird). In diesem Fall können Sie Ihrer Entität ein boolesches Feld hinzufügen (annotiert mit @Transient). damit es nicht gespeichert wird) namens isCodeEmpty (was standardmäßig falsch ist, wenn es nicht speziell initialisiert wird). Dann in Ihrem @PrePersist kommentierte Methode überprüfen Sie, ob der Wert für das Codefeld leer ist, und setzen Sie den booleschen Wert in diesem Fall auf wahr. Dann überarbeiten Sie Ihre setId(...) Methode so, dass sie (abgesehen vom Setzen des ID-Felds) diesen booleschen Wert überprüft und, wenn wahr, den Wert des Codefelds auf den des ID-Felds setzt:

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

}


}