domenica 26 febbraio 2012

Query JPQL e query native, comportamento apparentemente strano

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:

@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 :
  1. e' effettuata prima l'update su tutto il db;
  2. alla fine del metodo avviene la sincronizzazione dell'entity manager con il db e quindi modificato il cognome del primo record.
Viveversa usando jpql tutto è eseguito alla fine del metodo, quindi "prevale" l'ultima operazione, quella dell'aggiornamento

Nessun commento:

Posta un commento