JPA 实体作为 JSF Bean? [英] JPA Entity as 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>
另见:
- JSF MVC 框架中哪些组件是 MVC?
- JSF 控制器、服务和 DAO
- JSF 中 MVC 的矛盾解释
- JSF 2 重用定义在JPA 实体?
- 为什么实体 bean 不应该由 JSF 管理框架?
这篇关于JPA 实体作为 JSF Bean?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!