实体何时何地创建?
当 XHTML 页面加载并通过托管 bean 访问实体时,它们会被创建吗?
或者它们是在托管 bean 中自动创建的吗?
我们需要从托管 bean 的构造函数中手动创建它吗?
请参阅下面的代码(一些必要的代码可能尚未复制。)
实体将是:
public class PersonalInfo implements Serializable {
@Size(max = 50)
@Column(name = "FIRST_NAME", length = 50)
private String firstName;
// some getters and setters
}
网页将是:
<h:form>
<h:outputText value="first name"/>
<h:inputText value="#{personalInforController.personalInfo.firstName}" />
<h:commandButton value="hit me"
action="#{personalInforController.create}"
immediate="true"/>
</h:form>
辅助 bean 是:
@Named(value = "personalInfoController")
@SessionScoped
public class PersonalInforController {
@EJB
PersonalInfoFacade ejbFacade;
PersonalInfo personalInfo;
String defaultPage = "index";
public String create() {
try {
ejbFacade.create(personalInfo);
return "prepareCreate";
} catch (Exception e) {
return "success";
}
}
}
最佳答案
在给出的示例代码中,create
操作确实似乎无法工作。实体必须在此之前由支持 bean 创建。
如果它是一个简单的实体,则构造函数或 @PostConstruct 方法都可以工作。例如:
@Named(value = "personalInfoController")
@SessionScoped
public class PersonalInforController {
@EJB
PersonalInfoFacade ejbFacade;
PersonalInfo personalInfo;
String defaultPage = "index";
@PostConstruct
public void init() {
personalInfo = new PersonalInfo();
}
public String create() {
try {
ejbFacade.create(personalInfo);
return "prepareCreate";
} catch (Exception e) {
return "success";
}
}
关于代码的一些注释。将您的 bean 声明为 @SessionScoped 是非常可疑的,而且很可能是完全错误的。如果在两个选项卡或窗口中编辑personalInfo
,您将陷入痛苦的境地。我建议您将 bean 设置为 @ViewScoped(对于 CDI,Seam3 有一个单独的扩展可以实现此功能,如果您不能/不会使用此扩展,请考虑使用 @ManagedBean 而不是 @Named)。
此外,您可能希望将实例变量声明为私有(private),并为 ejbFacade
指定一个更好的名称(例如,personalInfoFacade)。我还怀疑 commandButton 是否需要立即,并且由于 outputText 显然是给定 inputText 的标签,因此您可能需要考虑使用 outputLabel 和 for 属性。
关于java - 何时/何地在 Java EE Web 应用程序上创建实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8463499/