sql >> Database teknologi >  >> RDS >> Oracle

Hvordan kender jeg id'et, før jeg gemmer et objekt i jpa

Med et @GeneratedValue type id kan du ikke kende denne værdi på forhånd (før du rent faktisk skriver den). Men når du fortsætter med din Bean, vil id-feltet blive udfyldt i den bean-forekomst, og du kan få den uden at skulle lave en ekstra forespørgsel efter den. Med andre ord:

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

Også afhængigt af hvordan din EntityManager er konfigureret, skal du muligvis også først udføre transaktionen (manuelt), før du kan få det id.

Opdater i henhold til kommentar

Hvis du vil opsnappe og gøre noget ved enheden, før den gemmes og/eller opdateres, kan du bruge JPA LifeCycle Listeners (hvis du bruger JPA version 2):Håndtering af JPA livscyklushændelser ved hjælp af lyttere og tilbagekald.

Grundlæggende kan du lave en validate() metode i din bønne, annoter den med @PrePersist og @PreUpdate og lav valideringen i den (hvis koden er tom, indstil den til id's værdi)

Opdatering pr. 2. kommentar

Ja, jeg tænkte ærligt lige på det lige nu:at hvis id'et er automatisk genereret, kan det blive udfyldt EFTER pre-persist-hændelsen, sådan at når din pre-persist-kode udføres, ved du stadig ikke hvad id'et er (du kan også bemærke, at i eksemplet, du linker til id'et IKKE er autogenereret, men indstillet manuelt). Hvad du kan gøre i dette tilfælde er at tilføje et boolesk felt til din enhed (annoteret med @Transient så det vil ikke blive ved med) kaldet isCodeEmpty (som er falsk som standard, hvis det ikke er specifikt initialiseret). Derefter i din @PrePersist annoteret metode kontrollerer du om værdien for kodefeltet er tomt, og hvis det er tilfældet, skal du sætte boolean til sand. Derefter refaktoriserer du din setId(...) metode sådan, at den (bortset fra at indstille id-feltet) vil kontrollere denne boolean, og hvis den er sand, indstilles værdien af ​​kodefeltet til værdien af ​​id-feltet:

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. Sådan rettes 'Systemressource overskredet' ved migrering til Windows 10

  2. SQL Server System Database Vedligeholdelse

  3. SQLiteAssetHelper:Kunne ikke åbne databasen til skrivning (prøver skrivebeskyttet)

  4. PostgreSQL Top lærings- og træningsressourcer