什么用,托管bean(支持bean)或实体bean?

时间:2011-12-11 10:03:12

标签: jsf-2 entity bean-validation managed-bean

我看到很多将bean标记为实体bean的示例(@Entity)&命名bean(CDI),以避免创建2个类(托管bean和实体bean),并且还使用Bean验证,以便可以在客户端和客户端上执行验证。服务器

那么我是否应该使用单个类,是否存在任何问题,或者我是否应该使用托管bean中的数据创建托管bean或服务层创建实体bean?

1 个答案:

答案 0 :(得分:14)

@Named或@ManagedBean注释通常用于让bean容器(CDI / JSF)在JSF中由表达式语言引用时根据需要创建bean实例。

对于@Entity bean,只获得一个任意的新实例通常没有多大意义。 @Entity与持久身份密切相关。因此,Entity Manager而不是bean容器请求这样的实体。

典型的模式是有一个(细长的)支持bean,它名为调用服务(在Java EE中通常是@Stateless)。然后该服务返回实体。

在一些非常简单的系统中,人们有时会将服务命名为EL,因此可直接供EL使用。但是,最终您经常希望让“支持代码”生成面部消息或处理(表)选择,这些都不应该是纯业务服务的关注点。

另一个常见的捷径是让支持bean直接包含业务代码(例如,检索实体的实体管理器)。这使得业务代码难以重复使用,但如果应用程序很简单并且不需要重复使用,那么您可能会使用它。

但让实体 - 备用bean是罕见的并且反对常见的Java EE模式。

请注意,支持bean可以直接返回实体,因此仍然可以使用bean验证。对于很久以前悄悄出现的奇怪的“分散/聚集”模式,没有必要(参见this question中的第二个例子)。

E.g。

@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(..., ...);
     }
 }

假设@Entity带注释的bean中有SomeEntity,现在可以在Facelet上使用bean验证,如:

<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>

如果对SomeEntity.name有约束,则会对其进行验证。