JPA 实体作为 JSF Bean? [英] JPA Entity as JSF Bean?

查看:33
本文介绍了JPA 实体作为 JSF Bean?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将实体用作 JSF 支持 Bean 是否有意义?

Does it make sense to use Entities as 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);
    }

    // ...
}

还是将它们分开保存并在最后将数据从支持 bean 传输到实体更好?

Or is it better to keep them separately and transfer the data from the backing bean to the entity at the end?

@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(控制器)的一个属性.这使代码保持DRY.您不想在所有地方复制相同的属性,更不用说对诸如 bean 验证约束之类的注释.

You could do so. It's technically possible. But it does (design)functionally not make any sense. You're basically tight-coupling the model with the controller. Usually the JPA entity (model) is a property of a JSF managed bean (controller). This keeps the code DRY. You don't want to duplicate the same properties over all place, let alone annotations on those such as bean validation constraints.

例如

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

}

使用此 Facelets 页面(查看):

with this Facelets page (view):

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

另见:

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆