作为JSFbean的JPA实体?

作为JSFbean的JPA实体?,jsf,entity,backing-beans,Jsf,Entity,Backing Beans,使用实体作为JSF支持bean有意义吗 @Entity @ManagedBean @ViewScoped public class User { private String firstname; private String lastname; @EJB private UserService service; public void submit() { service.create(this); } // ..

使用实体作为JSF支持bean有意义吗

@Entity
@ManagedBean
@ViewScoped
public class User {

    private String firstname;
    private String lastname;

    @EJB
    private UserService service;

    public void submit() {
        service.create(this);
    }

    // ...
}
或者最好将它们分开保存,并最终将数据从支持bean传输到实体

@ManagedBean
@ViewScoped
public class UserBean {

    private String firstname;
    private String lastname;

    @EJB
    private UserService service;

    public void submit() {
        User user = new User();
        user.setFirstname(firstname);
        user.setLastname(lastname);
        service.create(user);
    }

    // ...
}
你可以这样做。这在技术上是可能的。但它确实(设计)在功能上没有任何意义。基本上,模型与控制器紧密耦合。通常,JPA实体(模型)是JSF托管bean(控制器)的属性。这将保留代码。您不希望在所有位置重复相同的属性,更不用说在诸如bean验证约束之类的属性上的注释了

例如

使用此Facelets页面(视图):


...
另见:

谢谢你的回答。我想要一个好的设计。你的答案是一个好的设计样本还是对我的问题的回答,或者两者兼而有之?作为专家,您会建议JSF JPA项目采用哪种设计?:-)两者兼而有之。我通常根本不会回答/推荐错误的设计。
@ManagedBean
@ViewScoped
public class Register {

    private User user;

    @EJB
    private UserService service;

    @PostConstruct
    public void init() { 
        user = new User();
    }

    public void submit() {
        service.create(user);
    }

    public User getUser() {
        return user;
    }

}
<h:form>
    <h:inputText value="#{register.user.email}" />
    <h:inputSecret value="#{register.user.password}" />
    <h:inputText value="#{register.user.firstname}" />
    <h:inputText value="#{register.user.lastname}" />
    ...
    <h:commandButton value="Register" action="#{register.submit}" />
</h:form>