使用a4j:commandButton在第二个ajax提交之后的jsf验证阶段中的LazyLoadingException

时间:2013-04-02 11:53:43

标签: hibernate jsf richfaces lifecycle

当我尝试使用a4j第二次提交表单时遇到问题:commandButton

我的观点是:

<h:form id="myform">      
    <a4j:region renderRegionOnly="true">
        <h:panelGroup>
            <h:inputText size="4" maxlength="2"
                id="input1"
                value="#{departementController.departement.name}">
            </h:inputText>
            <h:inputText size="4" maxlength="2"
                id="input1"
                value="#{departementController.departement.subdepartement.name}">
            </h:inputText>
        </h:panelGroup>
    </a4j:region>

    <h:panelGrid columns="1">
        <a4j:commandButton
            value="save"
            action="#{departementController.validateDepartement}"/>
    </h:panelGrid>
</h:form>

当我第一次点击保存时,一切正常,保存更改。但是当我第二次点击保存时,我明白了:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

我检查过,第二次没有调用validateDepartement()方法,我只是得到了这个异常,并且保存失败。 只是说我在View中使用Open Session(视图中的事务)来处理视图中的延迟加载。

提前致谢,

的Stefan

2 个答案:

答案 0 :(得分:1)

我猜你在这里得到了LazyInitializationException:

<h:inputText size="4" maxlength="2"
            id="input1"
            value="#{departementController.departement.subdepartement.name}">

未调用action,因为异常发生在INVOKE_APPLICATION阶段之前。 bean属性subdepartment可能设置为LAZY的获取类型,这意味着在给定的事务中,根据subdepartment属性的请求,Hibernate代理将为您获取适当的bean。但这仅适用于该交易的范围。

第二个请求发生,ViewScope中存在先前的department bean,但第二个请求最终将创建一个新的Transaction。 department bean没有附加到第二个Transaction,这对于数据类型和EAGER获取的bean属性来说不是问题,但它将是LAZY属性的LazyInitializationException。

这可以通过reattaching the bean to the session修复...或者您只需将subdepartment设置为EAGER提取类型,或者您可以在此subdepartment中单独加载departmentController托管bean。

答案 1 :(得分:0)

我找到了答案,当我进行搜索时,我只是没有朝正确的方向看。 这是链接:

LazyInitializationException with CDI Managed Bean and Stateful Session Bean

无论如何,我把它添加到h:inputText,现在它可以工作:

<f:attribute name="collectionType" value="java.util.ArrayList" />

然而,尽管它有效,但我不确定这是否是最好的方法。