2012-01-14 11 views
15

mi pregunta es ¿por qué no funciona ras:cómo podemos conseguir APP EntityManager trabajo 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"); 
} 

Después de terminar el método veo "anotherName" en el PP también puedo comprobar con em.find (Customer.class, 1, Lock.None); pero todavía no funciona

RGDS

Respuesta

21

Estás rubor, pero no se está cometiendo - o de lo contrario termina la transacción/sesión que probablemente está configurado para auto-entrega.

Sí, después de llamar al flush(), el DBMS ahora conoce sus datos, pero siguiendo los estándares de ACID, ninguna otra sesión de base de datos verá estos datos hasta que se le indique al DBMS que lo confirme.

Sin conocer detalles adicionales acerca de la arquitectura detrás del resto de la aplicación, etc., es probable que quiera hacer algo como:

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

así que lo que es el uso ras ?! – Nav

+1

También cambio el modo de descarga para confirmar en lugar de automático, pero no ocurre nada – Nav

+7

La mayoría de las implementaciones de JPA almacenan en caché las operaciones dentro de la JVM (dentro del EntityManager). 'flush()' simplemente fuerza a que estas operaciones sean enviadas a la base de datos, etc., pero no implica un compromiso. http://stackoverflow.com/questions/4275111/correct-use-of-flush-in-jpa-hibernate tiene algunos detalles/discusiones adicionales que pueden ser útiles para usted. – ziesemer

Cuestiones relacionadas