복붙노트

[SPRING] OpenEntityManagerInViewFilter로 지연 초기화?

SPRING

OpenEntityManagerInViewFilter로 지연 초기화?

이미 약간의 JBoss webapp과 Lazy initialisation 문제가 있습니다. 따라서 Spring에서 조사하고 OpenEntityManagerInViewFilter를 사용하는 것이 좋습니다.

그럼에도 불구하고 나는 여전히 오류가 발생합니다. 당신이 나를 도울 수 있기를 바랍니다. Spring OEM Filter를 사용하기 위해 앱에서 변경해야하는 다른 사항은 무엇입니까?

내 설정은 다음과 같습니다.

@Entity
class Customer;

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

@Named
@RequestScoped
class CustomerFacade;

+ 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

나는 이것을 다음과 같이 설정했다. 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>

그게 전부 기본적으로 모든 설정. 그리고 게으른 적재 문제와 별개로 모든 것이 작동합니다.

해결법

  1. ==============================

    1.이전 엔티티에 액세스하지 않았는지 확인하십시오 (예 : 이전 요청의 세션에서 일련 화 된 엔티티).

    이전 엔티티에 액세스하지 않았는지 확인하십시오 (예 : 이전 요청의 세션에서 일련 화 된 엔티티).

  2. ==============================

    2.EntityManager의 init 매개 변수에 표시 할 필요가 있습니다.

    EntityManager의 init 매개 변수에 표시 할 필요가 있습니다.

    <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>
    
  3. from https://stackoverflow.com/questions/9304020/lazy-initialisation-with-openentitymanagerinviewfilter by cc-by-sa and MIT license