2012-11-29 33 views
5

Tôi nghĩ rằng tôi đang gặp vấn đề về hiểu biết cơ bản ở đây và tôi hy vọng một người nào đó có thể giải thích điều này với tôi.JAVA EE 6 chia sẻ các trường hợp giữa các EJB nhà nước

phép nói rằng chúng tôi có một EJB_A stateful và một EJB_B stateful và một ManagedbeanA sessionscoped:

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @EJB 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @EJB 
    EJB_A ejb; 
} 

Trong ManagedBeanA, các EJB_A được tạo ra. Bây giờ khi tôi sử dụng EJB_B, có EJB_A là một thuộc tính, một cá thể mới của EJB_A được tạo ra trong EJB_B. Nó không phải là cùng một ví dụ của EJB_A đã được tạo trong ManagedBeanA trước đây.

Tôi không hiểu điều đó, bởi vì tôi nghĩ rằng toàn bộ điểm EJB nhà nước là, cho mỗi khách hàng chỉ có một ví dụ được tạo ra và chia sẻ và quản lý bởi EJB-Container. Có ai đó giải thích điều này cho tôi biết không? Và cũng xin giải thích làm thế nào tôi có thể đạt được rằng cùng một ví dụ của một EJB được chia sẻ bởi nhiều EJB khác?

Cảm ơn bạn

+0

Khi bạn nói " Bây giờ khi tôi sử dụng EJB_B "ý của bạn là gì? Làm thế nào bạn xác minh nó không phải là cùng một ví dụ? –

+0

Khi tôi instianciate EJB_B và xem các thuộc tính (ví dụ: một chuỗi-tài sản) của EJB_A, các thuộc tính của EJB_A bean khác với các thuộc tính của EJB_A được instanciated bởi bean được quản lý. – user1727072

+0

Bạn 'instanciate' EJB_B ở đâu; trong một ManagedBean khác hoặc một máy khách Java (tra cứu từ xa)? –

Trả lời

9

Có, bạn lẫn lộn khái niệm khác nhau, và API khác nhau quá ... Tôi muốn sử dụng @Inject qua @EJB và xác định phạm vi các trường hợp tiêm ..

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
+0

bạn có thể giải thích tại sao tôi nên sử dụng @Inject thay vì @EJB? – user1727072

+1

Vâng, một cuộc thảo luận chuyên sâu về chủ đề này là: [link] http://www.seamframework.org/107780.lace Về cơ bản, yếu tố phân biệt đối xử là '@ Inject' luôn ý thức được phạm vi của đối tượng được tiêm và bạn chắc chắn rằng cá thể được tiêm là một cá thể được quản lý (do đó ngăn ngừa các vấn đề serialization bean từ xa khó chịu). Sử dụng '@ Inject' bạn có được đối tượng được quản lý (đôi khi được ủy quyền), sử dụng' @ EJB' bạn có được một Tài nguyên, không khác nhiều so với tra cứu JNDI đơn giản –

+0

cảm ơn bạn đã làm rõ rất nhiều cho tôi :)! – user1727072

1

Tôi đoán tôi đã trộn lẫn hai thứ - @Sessionscoped và @Stateful.

Chú thích @Stateful không có nghĩa là chỉ một cá thể cho mỗi khách hàng được tạo. Nó chỉ có nghĩa là @ Stateful-EJB thuộc về ONE khách hàng, trong khi một @ Stateless-EJB có thể được chia sẻ bởi nhiều khách hàng.

Vì vậy, @ Stateful-EJB có mối quan hệ N: 1 (N @ Stateful-EJBs thuộc về chính xác MỘT khách hàng) và @ Stateless-EJB có quan hệ N: M (N @ Stateless-EJBS thuộc về khách hàng M). Điều này có nghĩa là EJB-instance không thể được chia sẻ bởi nhiều EJB khác bằng cách chỉ sử dụng @ EJB-Annotation cho @Stateful EJBs.

Có vẻ như một @ Sessionscoped-Managedbean mặt khác chỉ được tạo một lần cho mỗi khách hàng.

Tôi đã hiểu đúng chưa?

2

Tôi vừa đọc một số here.

Lý do là mỗi lookup() của một EJB đậu 3.0 phiên stateful kết quả giao diện kinh doanh từ xa hoặc địa phương trong việc tạo ra một bản sắc đậu mới. Mỗi tham chiếu được trả về từ tra cứu đề cập đến một số phiên khác nhau của tiểu bang là . Tùy thuộc vào người gọi để xác định cách người quản lý muốn quản lý quyền truy cập vào tham chiếu đó. Thông thường, một ứng dụng web sẽ lưu trữ tham chiếu trong một phạm vi ứng dụng (HttpSession hoặc toàn bộ ứng dụng (ServletContext) để truy cập tiếp theo.

Và:

Đừng quên trong trường hợp của bạn, chúng tôi đang làm việc với 2 loại phiên: phiên đậu và phiên web. Trước đây, đảm bảo rằng khi bạn yêu cầu một bean trạng thái, danh tính của nó vẫn giữ nguyên trên phiên người dùng đó. Nhưng khi bạn sử dụng sau, bạn có phiên web trên đầu phiên đậu. Để đảm bảo rằng bạn truy cập cùng một bean từ 2 JSP khác nhau (hoặc khi bạn tải lại), bạn cần lưu trữ thông tin nhận dạng của hạt đậu vào phạm vi phiên web.

Vì vậy, bạn thực sự đúng.Khi bạn muốn sử dụng cá thể của mình, bạn phải sử dụng ManagedBean để lấy nó ở một nơi khác, vì cá thể EJB được liên kết với ngữ cảnh phiên này. Vì vậy, nếu bạn muốn đơn giản hóa nó và chắc chắn rằng EJB chỉ tồn tại một lần mỗi phiên, hãy sử dụng CDI và chú thích EJB chính nó thêm với @javax.enterprise.context.SessionScoped; hơn bạn có thể chắc chắn.

+0

cảm ơn bạn rất hữu ích! – user1727072

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