Về mặt lý thuyết, vấn đề hoàn toàn giống nhau: thực thể sẽ trở thành gián đoạn khi họ rời khỏi EJB trừ khi có điều gì đó giữ phạm vi của EntityManager mở. (Đây là một bài viết tuyệt vời về chủ đề nói chung: JPA implementation patterns: Lazy loading).
Từ một blog post tôi đọc:
8) Không mở Entity Manager Trong Xem hỗ trợ. [...] Trong EJB3, khi tổ chức của bạn lá đậu với giao dịch scoped EntityManager, nó được tách ra từ sự kiên trì bối cảnh và bạn có thể không còn dựa vào lười tải (trên thực tế, JPA đặc điểm kỹ thuật không xác định các hành vi trong tình hình như vậy, có lẽ một số nhà cung cấp ngoại lệ phụ thuộc sẽ được ném ...) Tất nhiên, bạn có thể sử dụng EntityManager với mở rộng bền bỉ bối cảnh, giữ giao dịch và kiên trì bối cảnh như miễn là yo bạn muốn. Nhưng tính năng này là chỉ khả dụng cho SFSB, trong khi các lớp DAO là các ví dụ điển hình của các dịch vụ không quốc tịch, vì chúng chỉ gửi các cuộc gọi đến lớp kiên trì . Ngoài ra, có cá thể đậu DAO chuyên dụng cho mỗi khách hàng có vẻ là một mức quá lớn.
Tuy nhiên, tôi không chắc nó có thực sự đúng hay không. Từ sự hiểu biết của tôi, bạn sẽ có thể viết một bộ lọc servlet sử dụng UserTransaction
để bắt đầu và cam kết giao dịch (như bộ lọc thông thường trong OSIV). EJB sau đó sẽ tham gia vào giao dịch bắt đầu trong bộ lọc và EntityManager
sẽ vẫn mở. Tôi đã không thử nghiệm nó mặc dù, nhưng đề nghị của tôi sẽ là để cho nó một thử.
Caucho có bộ lọc như bộ lọc bạn đã mô tả: http://wiki.caucho.com/TransactionFilter – cdmckay