【问题标题】:When/where do entities get created on a Java EE web application?在 Java EE Web 应用程序上何时/何处创建实体?
【发布时间】:2012-01-17 19:24:13
【问题描述】:

实体是在何时何地创建的?
它们是在 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";
        }
    }
}

【问题讨论】:

    标签: java jsf jpa entity


    【解决方案1】:

    在给出的示例代码中,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)。

    此外,您可能希望将您的实例变量声明为私有并给ejbFacade 一个更好的名称(例如personalInfoFacade)。我也怀疑commandButton上是否需要immediate,并且由于outputText显然是给定inputText的标签,您可能需要考虑使用outputLabel和for属性。

    【讨论】:

    • 非常感谢您的澄清!好的,所以我们需要从构造函数或用 atPostConstruct 修饰的方法手动创建它。由于netbeans自动生成的代码,我在这里有点困惑。无论如何,再次感谢。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2011-04-20
    • 1970-01-01
    • 2013-03-16
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多