2012-02-16 10 views
5

Tengo un poco de ya trabajando JBoss webapp, y un problema de inicialización Lazy. Por lo tanto, se me aconsejó investigar en Spring y usar OpenEntityManagerInViewFilter.Inicialización lenta con OpenEntityManagerInViewFilter?

Sin embargo, sigo teniendo el error, ¿espero que puedan ayudarme? ¿Qué más tengo que cambiar en mi aplicación para hacer uso del filtro OEM de Spring?

Mi configuración es la siguiente:

@Entity 
class Customer; 

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
class DaoService { 
    @PersistenceContext 
    EntityManager em; 
} 

@Named 
@RequestScoped 
class CustomerFacade; 

+ cosas de JSF.

[javax.enterprise.resource.webcontainer.jsf.context] (http--127.0.0.1-8080-1) org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: domain.Customer.customerList, no session or session was closed 

lo configuro como esto: Web.xml

<filter> 
    <filter-name> 
     OpenEntityManagerInViewFilter 
    </filter-name> 
    <filter-class> 
     org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter 
    </filter-class> 
    <init-param> 
     <param-name>singleSession</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>flushMode</param-name> 
     <param-value>AUTO</param-value> 
    </init-param> 
</filter> 
<!-- Include this if you are using Hibernate --> 
<filter-mapping> 
    <filter-name>OpenEntityManagerInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<!-- Spring config --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

applicationContext.xml:

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.transaction.manager_lookup_class"> 
       org.hibernate.transaction.JBossTransactionManagerLookup 
      </prop> 
     </props> 
    </property> 
</bean> 

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://java.sun.com/xml/ns/persistence 
     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="primary"> 
     <!-- If you are running in a production environment, add a managed 
     data source, the example data source is just for proofs of concept! --> 
     <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> 
     <properties> 
     <!-- Properties for Hibernate --> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
     <property name="hibernate.show_sql" value="false" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Eso es básicamente todo la puesta en marcha. Y todo funciona aparte del problema de la carga diferida.

+1

asegúrese de que el filtro OEMIV sea el primero en la tubería de filtrado (antes del servlet/filtro del controlador principal de la aplicación). –

+0

Ese es el web.xml completo que publiqué. No hay filtros o antes ... – membersound

+0

Estás usando JSF. ¿No declaras el servlet javax.faces.webapp.FacesServlet? –

Respuesta

2

Asegúrese de que el cliente no accede entidades de edad (por ejemplo, los serializados en la sesión en la solicitud anterior).

4

es necesario indicar en los parámetros de inicialización EntityManager

<filter> 
    <filter-name> 
     OpenEntityManagerInViewFilter 
    </filter-name> 
    <filter-class> 
     org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter 
    </filter-class> 
    <init-param> 
     <param-name>entityManagerFactoryBeanName</param-name> 
     <param-value>entityManagerFactory</param-value> 
    </init-param> 
    <init-param> 
     <param-name>flushMode</param-name> 
     <param-value>AUTO</param-value> 
    </init-param> 
</filter> 
+0

hm? eso es exactamente lo que tengo arriba ... – membersound

+0

¿Dónde está el mapeo de filtros? para el patrón de URL? al menos membersound lo ha hecho correctamente –

Cuestiones relacionadas