この質問が多く寄せられていることは知っていますが、ここで奇妙なことに、jsf 1.1 / richfaces 3 を hibernate 3.7 および spring 2.5 と一緒に使用しても問題はありませんでした。
フロントエンドを jsf 2.1 / richfaces 4 に移行したので (hibernate と spring は同じままです)、hibernate マッピング構成で「lazy=true」とマークされたコレクションにアクセスしようとすると、次の例外が表示されます。
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.mu.afs.Afi.cods, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)
at org.hibernate.collection.PersistentBag.size(PersistentBag.java:225)
at javax.faces.model.ListDataModel.isRowAvailable(ListDataModel.java:91)
at javax.faces.model.ListDataModel.setRowIndex(ListDataModel.java:105)
私が到達しようとしているコレクションは、エンティティrich:datatable
と同じ xhtml 内のa によって参照されています。Afi
以下は、マスター テーブルの ajax リクエストでコレクションにアクセスしようとする xhtml の一部です。
<rich:extendedDataTable id="tableCods" selectionMode="single"
selection="#{afiBean.codSelected}"
style="width: 100%; height: 100px"
value="#{afiBean.selectedAfi.cods}" var="cod">
...
<rich:column width="50px" style="text-align: right;">
<f:facet name="header"><h:outputText value="Months"/></f:facet>
<h:outputText value="#{cod.months}" />
</rich:column>
<rich:column width="80px" style="text-align: right;">
<f:facet name="header"><h:outputText value="Cap" /> </f:facet>
<h:outputText value="#{cod.cap}">
<f:convertNumber pattern="######,##0.00" locale="es_AR" />
</h:outputText>
</rich:column>
<rich:column width="200px" style="text-align: center;">
<f:facet name="header"><h:outputText value="Class"/></f:facet>
<h:outputText value="#{cod.clazz}" />
</rich:column>
...
ここに私のweb.xmlがあります:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
...
<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sessionFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
...
これは私の application-context.xml の一部です:
...
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="txManager" />
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="store*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED</prop>
<prop key="read*">PROPAGATION_REQUIRED</prop>
<prop key="load*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
...
エンティティにアクセスしているサービスはAfi
次のように定義されます。
<bean id="afiService" parent="txProxyTemplate">
<property name="proxyInterfaces" value="com.mu.afs.services.AfiService" />
<property name="target">
<bean class="com.mu.afs.services.impl.AfiServiceImpl">
<property name="afiDao" ref="afiDao" />
</bean>
</property>
</bean>
<bean id="afiliadosDao"
class="com.mu.afs.dao.impl.HibernateAfiDaoImpl"
parent="hibernateDaoSupport">
</bean>
誰かがこの問題に光を当てることができれば、本当に感謝しています。移行の問題に関連しているのか、それともこの構成に問題があり、以前のバージョンの jsf と richfaces で何らかの形で「マスク」されていたのかはわかりません。
読者を退屈させたり圧倒したりすることなく役立つと思われる関連情報をここに記載しようとしましたが、ここに何かが欠けている場合はお知らせください.
前もって感謝します。