Mã sau được thực thi bất cứ khi nào tôi muốn tồn tại bất kỳ thực thể nào. Mọi thứ dường như hoạt động tốt nhưng tôi không hiểu nó hoạt động như thế nào!Cách các giao dịch JPA hoạt động
EntityManager em = getEntityManager();
EntityTransaction userTransaction = em.getTransaction();
userTransaction.begin();
em.persist(ent);
userTransaction.commit();
EntityManager ở trên là một trường hợp duy nhất được chia sẻ cho toàn bộ ứng dụng. Sau khi bắt đầu giao dịch; Tôi chỉ nói em.persist (thực thể) .. Làm thế nào để hibernate biết nó thuộc về giao dịch nào!
Giả sử có 10 người dùng đồng thời trên ứng dụng của tôi và tất cả 10 chủ đề thực thi mã trên. Vì vậy, 10 giao dịch độc lập đang được tạo và cam kết. Nhưng tất cả 10 thực thể khác nhau tôi không liên kết chúng với các giao dịch tương ứng; JPA có thể làm việc như thế nào!
Dựa trên câu trả lời; chúng tôi có dưới đây; chúng ta có nói rằng chúng ta nên có một cá thể EntityManager cho mỗi luồng không? Sẽ không phải là một giết trên máy chủ! Chúng ta có nên gộp chung những trường hợp này không? Nó sẽ không bằng một lần nữa thực hiện loại kết nối tổng hợp?
Ý của bạn là "giao dịch" nào? Một EM có một giao dịch (cục bộ) duy nhất bất cứ lúc nào; nó không có nhiều. Chia sẻ một EM duy nhất trên nhiều luồng là một công thức cho các vấn đề, vì nó không đảm bảo an toàn cho luồng. – DataNucleus
http://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/transactions.html Một EntityManagerFactory là một đối tượng tạo chủ đề, tốn kém để tạo ra được chia sẻ bởi tất cả các luồng ứng dụng. Nó được tạo ra một lần, thường là khi khởi động ứng dụng. Một EntityManager là một đối tượng không an toàn, rẻ tiền nên được sử dụng một lần, cho một quy trình nghiệp vụ đơn lẻ, một đơn vị công việc duy nhất, và sau đó bị loại bỏ – Deepak
Đọc thêm; những gì tôi hiểu là tạo ra EntityManager là trọng lượng nhẹ nhưng vẫn không phải là trọng lượng rất nhẹ cho mỗi hoạt động DB nhỏ mà chúng tôi tạo ra. Giải pháp được đề xuất là tạo EM cho mỗi yêu cầu. Vì vậy, có vẻ như nó phải ở cấp ThreadLocal. – Deepak