2012-01-14 4 views
15

la mia domanda è: perché a filo non funziona:come possiamo ottenere JPA EntityManager lavoro Flush

public void ejbService(){ 
    Customer c = em.find(Customer.class,1); 
    c.setName("newName"); 
    em.flush(); 
    //at this point when I query mysql table I can not see "newName" 


    thread.sleep(10000); 

    c.setName("anotherName"); 
} 

Dopo aver terminato il metodo che vedo "AltroNick" nel db anche verifico con em.find (Customer.class, 1, Lock.None); ma ancora non funziona

RGDS

risposta

21

Stai vampate di calore, ma non stai commettendo - o comunque terminare la transazione/sessione che è probabilmente configurato per auto-commit.

Sì, dopo aver chiamato flush(), il DBMS ora è a conoscenza dei dati, ma in seguito agli standard ACID, nessun'altra sessione di database visualizzerà questi dati fino a quando non verrà comunicato al DBMS di eseguirne il commit.

Senza conoscere ulteriori dettagli sulla architettura dietro il resto della vostra applicazione, ecc, probabilmente stai cercando di fare qualcosa di simile:

em.getTransaction().commit(); 
+1

quindi qual è l'utilizzo a filo ?! – Nav

+1

Modifica anche la modalità flush per il commit anziché quella automatica, ma non succede nulla – Nav

+7

La maggior parte delle implementazioni JPA memorizzerà nella cache le operazioni all'interno della JVM (all'interno di EntityManager). 'flush()' obbliga semplicemente queste operazioni ad essere inviate al database, ecc. - ma non implica un commit. http://stackoverflow.com/questions/4275111/correct-use-of-flush-in-jpa-hibernate contiene alcuni dettagli/discussioni aggiuntivi che potrebbero esserti utili. – ziesemer