2012-01-14 19 views
15

câu hỏi của tôi là lý do tại sao tuôn ra không hoạt động:thế nào chúng ta có thể nhận được JPA EntityManager việc 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"); 
} 

Sau khi hoàn thành phương pháp tôi thấy "anotherName" trong db tôi cũng kiểm tra xem nó với em.find (Customer.class, 1, Lock.None); nhưng vẫn không hoạt động

Rgds

Trả lời

21

Bạn đang đỏ bừng mặt, nhưng bạn không cam kết - hoặc kết thúc giao dịch/phiên trong đó có khả năng cấu hình để tự động cam kết. Có, sau khi gọi flush(), DBMS hiện nhận thức được dữ liệu của bạn - nhưng theo tiêu chuẩn ACID, không có phiên cơ sở dữ liệu nào khác sẽ thấy dữ liệu này cho đến khi DBMS được yêu cầu cam kết.

Mà không biết thêm chi tiết về kiến ​​trúc đằng sau phần còn lại của ứng dụng của bạn, vv, có lẽ bạn đang tìm cách để làm một cái gì đó như:

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

nên việc sử dụng tuôn ra là gì ?! – Nav

+1

Tôi cũng thay đổi chế độ tuôn ra để cam kết thay vì tự động nhưng không có gì xảy ra – Nav

+7

Hầu hết các triển khai JPA sẽ lưu các hoạt động trong phạm vi JVM (trong EntityManager). 'flush()' chỉ buộc các hoạt động này được gửi đến cơ sở dữ liệu, v.v. - nhưng không hàm ý một cam kết. http://stackoverflow.com/questions/4275111/correct-use-of-flush-in-jpa-hibernate có một số chi tiết/thảo luận bổ sung có thể hữu ích cho bạn. – ziesemer

Các vấn đề liên quan