JPA实体作为JSF Bean使用?

10

在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传输到实体中,这样是否更好呢?

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

    // ...
}
1个回答

21

从技术上讲,你可以这样做。但是这在设计和功能上都没有任何意义。你基本上是将模型与控制器紧密耦合在一起。通常,JPA实体(模型)是JSF管理的bean(控制器)的属性。这使代码保持DRY(不要重复自己)。你不想在所有地方重复相同的属性,更不用说这些属性上的注解,例如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;
    }

}

使用这个 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>

另请参阅:


1
谢谢你的回答。我想要一个好的设计。你的回答是一个好的设计样本,还是对我的问题的回答,或者两者兼备?作为一个GURU,你会建议在JSF JPA项目中采用哪种设计呢?:-) - Kayser
7
这是两全其美的。通常我不会回答或推荐错误的设计。 - BalusC
你认为在Bean类中直接暴露实体是一个好主意吗? - Daniela Morais
这个设计是最简单的,但它将持有对entityManager的引用(至少在eclipselink中如此),而entityManager又会持有identityMap。如何处理这个问题? - cocorossello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接