2011-12-08 40 views
18

Tôi hiện đang gặp sự cố khi hiểu khái niệm về JPA.Ứng dụng so với Quản lý đối tượng Container được quản lý

Tôi hiện đang sử dụng/phát triển EclipseLink, Glassfish, cơ sở dữ liệu Derby gần đây để chứng minh một dự án.

Trước khi tôi phát triển một thứ gì đó trong bức tranh lớn hơn nhiều, tôi cần phải hoàn toàn chắc chắn về cách PersistingUnit này hoạt động như thế nào về các phạm vi khác nhau.

Tôi có nhiều servlet 3.0 và hiện đang lưu các lớp thực thể liên quan của người dùng trong đối tượng request.session (mọi thứ trong cùng một tệp chiến tranh). Tôi hiện đang sử dụng EntityManager do ứng dụng quản lý bằng cách sử dụng tiêm EntityManagerFactory và UserTransaction. Nó hoạt động trơn tru khi nó được thử nghiệm bởi bản thân mình. Các phiên bản khác nhau của các thực thể xảy ra khi 2 người truy cập cùng một thực thể cùng một lúc. Tôi muốn làm việc với các bean được quản lý qua cùng một WAR, cùng một đơn vị kiên trì nếu có thể.

Tôi đã đọc http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html và nhiều giải thích về những phạm vi không có ý nghĩa gì đối với tôi.

Câu chuyện dài ngắn, cách sử dụng và sự khác biệt của ứng dụng và vùng chứa được quản lý EntityManagers là gì?

Trả lời

17

Khi bạn nói giao dịch được quản lý ứng dụng, điều đó có nghĩa là mã của bạn có nghĩa vụ xử lý giao dịch. Tóm lại nó có nghĩa là:

Bạn gọi:

entityManager.getTransaction().begin(); //to start a transaction 

sau đó nếu thành công bạn sẽ đảm bảo để gọi

entityManager.getTranasaction().commit(); //to commit changes to database 

hoặc trong trường hợp thất bại, bạn sẽ đảm bảo để gọi:

entityManager.getTransaction().rollBack(); 

Bây giờ hãy tưởng tượng bạn có một vùng chứa, biết khi nào cần gọi begin(), commit() hoặc rollback(), giao dịch được quản lý bằng container đó. Một người nào đó đang chăm sóc giao dịch nhân danh bạn.

Bạn chỉ cần chỉ định điều đó.

+0

ý của bạn là gì "Bây giờ hãy tưởng tượng bạn có một thùng chứa, ai biết khi nào cần gọi, cam kết hoặc quay lại, giao dịch được quản lý bởi container đó. Ai đó thay mặt bạn giao dịch". –

+0

Container giống như Spring, nơi bạn cấu hình bean của bạn, bạn xác định thực thể tansaction của bạn giống như bạn cấu hình một bean thực thể, bạn chỉ định bean của bạn là @Transactional và giao dịch của bạn được thực hiện bởi Spring – mprabhat

+3

Tôi đã tìm thấy câu hỏi phản ánh cái gì Tôi đã tìm kiếm - "sử dụng và sự khác biệt của ứng dụng và container quản lý EntityManagers", chỉ để tìm ra rằng các câu trả lời được chấp nhận nói về một cái gì đó khác nhau - container vs ứng dụng xử lý _transactions_. Trên hết, câu trả lời bắt đầu bằng "Khi bạn nói giao dịch được quản lý ứng dụng", OP không nói. – alterfox

11

Giao dịch quản lý container (CMT) có thể được coi là một loại giao dịch khai báo, trong trường hợp đó, quản lý giao dịch được giao cho container (thường là EJB container) và nhiều công việc phát triển có thể được đơn giản hóa.

Nếu chúng tôi đang ở trong môi trường Java EE với vùng chứa EJB, chúng tôi có thể sử dụng CMT trực tiếp.

Nếu chúng ta đang ở trong môi trường Java SE, hoặc môi trường Java EE không có thùng chứa EJB, chúng ta vẫn có thể tận dụng CMT, một cách là sử dụng Spring, sử dụng AOP để thực hiện quản lý giao dịch khai báo; Một cách khác là sử dụng Guice, sử dụng một PersistFilter để thực hiện giao dịch khai báo.

Trong CMT, một vùng chứa (bất kỳ vùng chứa EJB, Spring hoặc Guice) sẽ xử lý việc truyền bá giao dịch và các công cụ cam kết/rollback;

Ứng dụng quản lý giao dịch (AMT) khác với CMT ở chỗ chúng ta cần xử lý giao dịch theo lập trình trong mã của chúng tôi.

+4

Câu trả lời hay, nhưng đừng quên rằng mọi môi trường Java EE chính thức luôn có một thùng chứa EJB. Nếu không, nó không thể được gọi là Java EE (do đó, Tomcat không phải là một môi trường Java EE chính thức). Ngoài ra, trong Java EE, ngược lại của CMT được gọi là BMT; Bean Managed Transactions. –

+0

Cảm ơn rất nhiều vì sự bổ sung của bạn cho câu trả lời này. – aqingsao

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