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