1

当我尝试使用 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() 方法,我只是得到了这个异常,并且保存失败。只是说我正在使用视图中的打开会话(视图中的事务)来处理视图中的延迟加载。

提前致谢,

斯特凡

4

2 回答 2

1

我猜你在这里得到了 LazyInitializationException:

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

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

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

这可以通过将 bean 重新附加到会话来解决......或者您可以设置subdepartment为 EAGER 获取类型,或者您可以在此托管 beansubdepartment中单独加载。departmentController

于 2013-04-02T13:01:03.230 回答
0

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

带有 CDI 托管 Bean 和有状态会话 Bean 的 LazyInitializationException

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

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

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

于 2013-04-02T13:12:08.733 回答