首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用什么,托管bean(支持bean)还是实体bean?

使用什么,托管bean(支持bean)还是实体bean?
EN

Stack Overflow用户
提问于 2011-12-11 18:03:12
回答 1查看 6.5K关注 0票数 14

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-11 18:30:29

当JSF中的表达式语言引用时,@Named或@ManagedBean注释通常用于让bean容器(CDI/JSF)按需创建bean的实例。

对于@Entity bean来说,仅仅获得一个任意的新实例通常没有多大意义。@Entity与持久化标识紧密相关。因此,这样的实体是从Entity Manager而不是从bean容器请求的。

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

在一些非常琐碎的系统中,人们有时确实会将服务命名,从而直接对EL可用。但是,最终您通常希望让“支持代码”生成faces消息或处理(表)选择,这些都不应该是纯业务服务所关心的事情。

另一种常见的快捷方式是让支持bean直接包含业务代码(例如,检索实体的实体管理器)。这使得业务代码很难重用,但如果应用程序很琐碎,并且不需要重用,那么您可能会逃脱惩罚。

但是让实体成为支持bean的情况并不多见,而且与常见的Java模式相反。

只需注意,支持bean可以直接返回实体,因此仍然可以使用bean验证。很久以前出现的奇怪的“分散/聚集”模式根本不需要(参见this question中的第二个示例)。

例如。

代码语言:javascript
复制
@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(..., ...);
     }
 }

假设SomeEntity在@Entity注解的bean中,bean验证现在可以在Facelet上使用,如下所示:

代码语言:javascript
复制
<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的约束,则会对其进行验证。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8463178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档