sql >> Database >  >> RDS >> Oracle

Hoe weet ik de id voordat ik een object opslaat in jpa

Met een id van het type @GeneratedValue kun je die waarde niet van tevoren weten (voordat je hem daadwerkelijk schrijft). Als u echter uw Bean aanhoudt, wordt het id-veld in die bean-instantie ingevuld en kunt u deze verkrijgen zonder dat u er een extra zoekopdracht voor hoeft uit te voeren. Met andere woorden:

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

Ook, afhankelijk van hoe uw EntityManager is geconfigureerd, moet u mogelijk ook eerst de transactie (handmatig) vastleggen voordat u die id kunt krijgen.

Bijwerken volgens opmerking

Als u de entiteit wilt onderscheppen en er iets aan wilt doen voordat deze wordt opgeslagen en/of bijgewerkt, kunt u JPA LifeCycle Listeners gebruiken (als u JPA-versie 2) gebruikt:JPA-levenscyclusgebeurtenis afhandelen met behulp van listeners en callbacks.

In principe kun je een validate() . maken methode in je bean, annoteer het met @PrePersist en @PreUpdate en doe de validatie erin (als de code leeg is, stel deze dan in op de waarde van de id)

Update per 2e reactie

Ja, daar heb ik zojuist eerlijk gezegd net aan gedacht:dat als de id automatisch wordt gegenereerd, deze NA de pre-persist-gebeurtenis kan worden ingevuld, zodat wanneer uw pre-persist-code wordt uitgevoerd, u nog steeds niet weet wat de id is (u merkt misschien ook dat in het voorbeeld dat u linkt naar de id NIET automatisch wordt gegenereerd maar handmatig wordt ingesteld). Wat u in dit geval kunt doen, is een boolean-veld toevoegen aan uw entiteit (geannoteerd met @Transient zodat het niet blijft bestaan) genaamd isCodeEmpty (wat standaard onwaar is als het niet specifiek is geïnitialiseerd). Vervolgens in uw @PrePersist geannoteerde methode controleert u of de waarde voor het codeveld leeg is en zo ja, stelt u de boolean in op true. Vervolgens refactoreert u uw setId(...) methode zodanig dat (afgezien van het instellen van het id-veld) het deze boolean zal controleren, en indien waar de waarde van het codeveld wordt ingesteld op die van het id-veld:

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. Waarom is het uitvoeren van opgeslagen procedures sneller dan een SQL-query vanuit een script?

  2. Hoe kan ik alle tabellen in MySQL vinden met specifieke kolomnamen erin?

  3. Welke bronnen zijn er voor het afstemmen van databaseprestaties?

  4. Equivalente functie voor DATEADD() in Oracle