当我尝试使用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
答案 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" />
然而,尽管它有效,但我不确定这是否是最好的方法。