【问题标题】:JPA Entity as JSF Bean?JPA 实体作为 JSF Bean?
【发布时间】:2017-04-10 02:03:23
【问题描述】:

将实体用作 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);
    }

    // ...
}

【问题讨论】:

    标签: jsf entity backing-beans


    【解决方案1】:

    可以这样做。这在技术上是可行的。但它(设计)在功能上没有任何意义。您基本上将模型与控制器紧密耦合。通常,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>
    

    另见:

    【讨论】:

    • 感谢您的回答。我想要一个好的设计。你的答案是一个好的设计样本还是对我的问题的回答,或者两者兼而有之?作为 GURU,您会为 JSF JPA 项目建议哪种设计。:-)
    • 两者兼而有之。我通常根本不会回答/推荐错误的设计。
    • 你认为直接在 Bean 类中公开实体是个好主意吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2011-10-02
    • 2013-09-13
    • 1970-01-01
    相关资源
    最近更新 更多