sql >> Databasteknik >  >> RDS >> Oracle

Hur vet jag id:t innan jag sparar ett objekt i jpa

Med ett @GeneratedValue-typ-id kan du inte veta det värdet i förväg (innan du faktiskt skriver det). Men när du behåller din Bean kommer id-fältet att fyllas i i den böninstansen och du kan få den utan att behöva göra en extra fråga för den. Med andra 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();

Dessutom, beroende på hur din EntityManager är konfigurerad, kanske du också först måste utföra transaktionen (manuellt) innan du kan få det ID:t.

Uppdatera enligt kommentar

Om du vill fånga upp och göra något med enheten innan den sparas och/eller uppdateras kan du använda JPA LifeCycle Listeners (om du använder JPA version 2):Hantera JPA livscykelhändelse med hjälp av lyssnare och återuppringningar.

I grund och botten kan du göra en validate() metod i din böna, annotera den med @PrePersist och @PreUpdate och gör valideringen i den (om koden är tom ställ in den till id-värdet)

Uppdatering per andra kommentar

Ja, jag tänkte ärligt talat på det nyss:att om id:t genereras automatiskt kan det fyllas i EFTER pre-persist-händelsen, så att när din pre-persist-kod exekveras så vet du fortfarande inte vad id:t är (du kanske också märker att i exemplet du länkar till ID:t INTE är autogenererat utan ställs in manuellt). Vad du kan göra i det här fallet är att lägga till ett booleskt fält till din enhet (kommenteras med @Transient så att den inte kvarstår) kallas isCodeEmpty (vilket är falskt som standard om det inte är specifikt initierat). Sedan i din @PrePersist annoterad metod du kontrollerar om värdet för kodfältet är tomt och i så fall ställer du in boolean till true. Sedan refaktorerar du ditt setId(...) metod så att (bortsett från att ställa in id-fältet) kommer den att kontrollera detta boolean, och om det är sant, ställ in värdet på kodfältet till det för id-fältet:

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. Oracle:'=ANY()' kontra 'IN ()'

  2. Flera sätt att ta bort dubbletter från SQL-tabeller

  3. Hur man formaterar ett datum i T-SQL

  4. Hur SQLite Upper() fungerar