java - 何时/何地在 Java EE Web 应用程序上创建实体?

标签 java jsf jpa entity

实体何时何地创建?
当 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/

相关文章:

java - dao 层中的 NullPointerException(仅持久有效)

java.sql.SQLException : Access denied for user '' @'localhost' (using password: NO) with Spring+JPA+ MySql 异常

jpa - 始终打开 EntityManager

java - BitmapFactory : Unable to decode stream: java. io.FileNotFoundException:打开失败:ENOENT(没有这样的文件或目录)

java - 从 ant 调用 wsimport 生成的类中去掉 JAXBElement

java - 使用堆栈反转单词

jsf - 读取 bean 属性的立即与延迟评估

jsf - 如何在托管 bean 中以编程方式评估 EL

java - 为什么 Ant 可以识别某些环境变量而不识别其他环境变量

java - 尝试在 JSF 中执行 "include"时出现问题