Ho notato un comportamento "strano" utilizzando in JPA le query JPQL rispetto a quelle Native.
Abbiamo la seguente situazione di partenza su un db:
In un Ejb stateless abbiamo i due seguenti metodi:
Il primo metodo utilizza le query JPQL, il secondo invece la query native (sql standard).
Il risultato delle due esecuzioni però differisce.
In entrambi i casi in output trovo la scritta "bianchi".
Ma sul db nel caso di query JPQL ho la seguente situazione
quindi tutti i record della tabella sono stati aggiornati con il valore "gialli".
Invece nel secondo caso (query nativa):
Il primo record, quello che era stato recuperato tramite il metodo find dell'Entity Manager risulta con cognome "bianchi" e solo gli altri due record sono stati aggiornati.
Il motivo di questo apparente comportamento è che la query nativa viene eseguita in un suo contesto transazionale, quindi :
Abbiamo la seguente situazione di partenza su un db:
In un Ejb stateless abbiamo i due seguenti metodi:
@Override
public void updateForTestJPQL() {
Persona cust = em.find(Persona.class, 1);
cust.setCognome("bianchi");
Query q = em.createQuery( "UPDATE Persona p SET p.cognome = 'gialli'");
q.executeUpdate();
System.out.println(cust.getCognome());
}
@Override
public void updateForTestNative(){
Persona cust = em.find(Persona.class, 1);
cust.setCognome("bianchi");
Query q=em.createNativeQuery("UPDATE persona p SET p.cognome = 'gialli'");
q.executeUpdate();
System.out.println(cust.getCognome());
}
Il primo metodo utilizza le query JPQL, il secondo invece la query native (sql standard).
Il risultato delle due esecuzioni però differisce.
In entrambi i casi in output trovo la scritta "bianchi".
Ma sul db nel caso di query JPQL ho la seguente situazione
quindi tutti i record della tabella sono stati aggiornati con il valore "gialli".
Invece nel secondo caso (query nativa):
Il primo record, quello che era stato recuperato tramite il metodo find dell'Entity Manager risulta con cognome "bianchi" e solo gli altri due record sono stati aggiornati.
Il motivo di questo apparente comportamento è che la query nativa viene eseguita in un suo contesto transazionale, quindi :
- e' effettuata prima l'update su tutto il db;
- alla fine del metodo avviene la sincronizzazione dell'entity manager con il db e quindi modificato il cognome del primo record.
Nessun commento:
Posta un commento