JPA实体作为JSF Bean?

Kay*_*ser 10 jsf entity backing-beans

将实体用作JSF Backing Beans是否有意义?

@Entity
@ManagedBean
@ViewScoped
public class User {

    private String firstname;
    private String lastname;

    @EJB
    private UserService service;

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是将它们分开保存并将数据从支持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);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 21

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

例如

@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;
    }

}
Run Code Online (Sandbox Code Playgroud)

使用此Facelets页面(查看):

<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>
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 这两者都是.我通常不会回答/推荐错误的设计. (7认同)