2012-01-14 18 views
15

floş çalışmıyor neden sorum şu:biz JPA EntityManager Flush iş bulmak nasıl

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"); 
} 

ben db yılında "anotherName" bkz yöntemi bitirdikten sonra da ben (em.find ile kontrol Customer.class, 1, Lock.None); ama yine de

rgds

cevap

21

Sen kızarma ediyoruz çalışmaz, ancak işlemekten değiliz - veya başka muhtemel otomatik taahhüt için yapılandırılmış işlem/oturumu biten.

Evet, flush() numaralı telefonu aradıktan sonra, DBMS artık verilerinizin farkındadır - ancak ACID standartlarını izledikten sonra, DBMS'ye bunu bildirmesi söyleninceye kadar başka hiçbir veritabanı oturumu bu verileri görmeyecektir. vb Başvurunuzun, gerisinde mimarisi hakkında ek ayrıntılar bilmeden

, muhtemelen böyle bir şey yapmak arıyorsanız:

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

böylece floş kullanım nedir ?! – Nav

+1

Ayrıca, otomatik yerine işlem yapmak için floş modunu değiştiririm ama hiçbir şey olmuyor – Nav

+7

Çoğu JPA uygulaması, JVM (EntityManager içinde) içindeki işlemleri önbelleğe alır. 'flush()' sadece bu işlemleri veri tabanına gönderilmek üzere zorlar - ama bir taahhüt anlamına gelmez. http://stackoverflow.com/questions/4275111/correct-use-of-flush-in-jpa-hibernate, size yardımcı olabilecek bazı ek ayrıntılar/tartışmalara sahiptir. – ziesemer