2011-12-11 17 views
14

Tôi thấy rất nhiều ví dụ đánh dấu đậu là đậu thực thể (@Entity) & tên đậu (CDI), để tránh tạo 2 lớp (bean được quản lý & bean thực thể) và cũng sử dụng Bean Validation để xác thực có thể được thực hiện trên cả máy khách & máy chủ.những gì để sử dụng, quản lý đậu (đậu sao) hoặc đậu thực thể?

Vì vậy, tôi nên sử dụng một lớp duy nhất hay không, đang có bất kỳ vấn đề hay tôi nên được có đậu được quản lý của tôi hoặc lớp dịch vụ tạo entity bean bằng cách sử dụng dữ liệu từ đậu được quản lý?

Trả lời

14

Chú thích @Named hoặc @ManagedBean thường được sử dụng để cho vùng chứa bean (CDI/JSF) tạo một cá thể của bean theo yêu cầu khi được tham chiếu bằng ngôn ngữ biểu thức trong JSF.

Đối với đậu @Entity, nó thường không làm cho rằng có rất nhiều ý nghĩa để chỉ nhận được một thể hiện mới tùy ý. @Entity được kết nối rất mạnh mẽ với một danh tính liên tục. Một thực thể như vậy được yêu cầu từ Entity Manager và không phải từ một thùng chứa đậu.

Mẫu điển hình là có một bean sao lưu (mỏng) được đặt tên thực hiện cuộc gọi đến một dịch vụ (thường lần lượt là @Stateless trong Java EE). Dịch vụ sau đó trả về các thực thể.

Trong một số hệ thống rất tầm thường, đôi khi mọi người thực hiện dịch vụ có tên và do đó trực tiếp có sẵn cho EL. Tuy nhiên, cuối cùng bạn thường muốn để "mã sao lưu" tạo ra các thông báo khuôn mặt hoặc xử lý các bảng (lựa chọn), tất cả những thứ đó không phải là mối quan tâm của một dịch vụ kinh doanh thuần túy.

Một phím tắt chung là để cho đậu sao lưu chứa mã số kinh doanh trực tiếp (ví dụ người quản lý thực thể lấy các thực thể). Điều này làm cho mã doanh nghiệp khó sử dụng lại, nhưng nếu ứng dụng là tầm thường và không cần phải sử dụng lại, bạn có thể lấy đi nó.

Nhưng để cho đơn vị -be- đậu ủng hộ là hiếm và chống với mẫu Java EE chung.

Chỉ cần lưu ý đậu sao lưu có thể trở lại đơn vị trực tiếp, vì vậy đậu-xác nhận vẫn có thể được sử dụng. Không có nhu cầu gì cho mẫu 'phân tán/thu thập' kỳ lạ đã được dựng lên một thời gian dài trước đây (Xem ví dụ thứ hai trong số this question).

Ví dụ:

@ViewScoped 
@ManagedBean 
public class BackingBean { 

    private SomeEntity myEntity; // + getter 

    @EJB 
    private Service service; 

    @PostConstruct 
    public void init() { 
     myEntity = service.getSomeEntity(); 
    } 

    public void save() { 
     service.save(myEntity); 
     FacesContext.getCurrentInstance().addMessage(..., ...); 
    } 
} 

Giả sử SomeEntity trong đậu @Entity chú thích, xác đậu bây giờ có thể được sử dụng trên một Facelet như:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
>  
    <h:body> 
     <h:form>  
      <h:inputText value="#{backingBean.myEntity.name}" />       
      <h:commandButton value="Save" action="#{backingBean.save}" /> 
     </h:form>    
    </h:body> 
</html> 

Nếu có một hạn chế trên SomeEntity.name nó sẽ được xác nhận.

+0

Cám ơn bài viết của bạn, nó rất hữu ích nhưng bạn có ví dụ hoàn chỉnh của mã JSF mà chúng ta có thể sử dụng và hiểu được cách thích hợp của ứng dụng JSF bằng văn bản hoặc nó sẽ là tuyệt vời nếu bạn có thể chỉ cho tôi một số hướng. – Rachel

+0

+1 cho một câu trả lời rất rõ ràng cũng mang lại bối cảnh rộng hơn cho vấn đề –

+0

"Chỉ cần lưu ý rằng bean sao lưu có thể trả về trực tiếp thực thể, vì vậy việc xác thực bean vẫn có thể được sử dụng./thu thập 'mô hình đã được dựng lên từ rất lâu rồi. " Tôi tự hỏi nếu bạn có thể giải thích về điều này. Mẫu 'phân tán/thu thập' này là gì? Điều này tương tự như vậy: Tôi đã nghe một số người ủng hộ sự tách biệt lớn hơn giữa khung nhìn và mô hình, và do đó họ ánh xạ các trường Facelets vào các thuộc tính bean sao lưu (thường là nguyên thủy), sau đó chúng sử dụng dịch vụ không trạng thái để chấp nhận các thuộc tính, thực hiện xác thực, và cư trú và tồn tại thực thể. – DavidS