JPA Entity как JSF Бин?

Имеет ли смысл использовать сущности в качестве вспомогательных компонентов JSF?

@Entity
@ManagedBean
@ViewScoped
public class User {

    private String firstname;
    private String lastname;

    @EJB
    private UserService service;

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

    // ...
}

Или лучше хранить их отдельно и в конце передавать данные из вспомогательного компонента в сущность?

@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 ответ

Решение

Вы могли бы сделать это. Это технически возможно. Но это (дизайн) функционально не имеет никакого смысла. Вы в основном тесно связываете модель с контроллером. Обычно сущность (модель) JPA является свойством управляемого компонента JSF (контроллера). Это держит код СУХОЙ. Вы не хотите дублировать одни и те же свойства повсюду, не говоря уже об аннотациях таких, как ограничения проверки 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>

Смотрите также:

Другие вопросы по тегам