LazyInitializationException, хотя openSessionInViewInterceptor - PullRequest
8 голосов
/ 13 января 2009

У меня проблема с LazyInitializationException, хотя я использую openSessionInViewInterceptor. Я прочитал очень много постов на эту тему, и я попробовал три или четыре различных подхода к ней.

Во-первых, я не хочу устанавливать в false атрибут lazzy в файле конфигурации Hibernate. Итак, я хочу реальное решение этой проблемы. Я использую Spring 2.5, Hibernate 3, Netbeans и Tomcat.

Моя реализация выглядит следующим образом:

servlet.xml

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="openSessionInViewInterceptor" />
            </list>
        </property>
        <property name="mappings">
            <props>
                <prop key="/index.htm">indexController</prop>
            </props>
        </property>
 </bean>
 <bean id ="openSessionInViewInterceptor" name="openSessionInViewInterceptor"
    class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>

applicationContext.xml

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref local="dataSource"/>
        </property>
        <property name="mappingResources">
            <list>
                <value>TasquesDAOHibernate/Model/Tasca.hbm.xml</value>
                <value>TasquesDAOHibernate/Model/TipusTasca.hbm.xml</value>
                <value>TasquesDAOHibernate/Model/Prioritat.hbm.xml</value>
                <value>TasquesDAOHibernate/Model/Persona.hbm.xml</value>
                <value>TasquesDAOHibernate/Model/EstatTasca.hbm.xml</value>
                <value>TasquesDAOHibernate/Model/Usuari.hbm.xml</value>
                <value>TasquesDAOHibernate/Model/LogActivitat.hbm.xml</value>
                <value>TasquesDAOHibernate/Model/ObjecteSIPANUsuari.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.jdbc.batch_size">0</prop>
            </props>
        </property>
    </bean>


    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="sessionFactory"/>
        </property>
    </bean>

    <bean id="tasquesDAO" class="TasquesDAOHibernate.TasquesDAOHibernate">
        <property name="sessionFactory">
            <ref local="sessionFactory"/>
        </property>
    </bean>

<bean id="tasquesService" name="tasquesService" class="Tasques_www.service.TasquesService" >
        <property name="tasquesDAO">
            <ref local="tasquesDAO"/>
        </property>
        <property name="transactionManager" ref="transactionManager"/>
    </bean>

TasquesService.java

public List<Tasca> getTasques() {
        List<Tasca> tasques = (List)this.transactionTemplate.execute(new           TransactionCallback() {

            public Object doInTransaction(TransactionStatus status) {
                Object tasques = tasquesDAO.getTasques();
                return tasques;
            }
        });
        return tasques;
    }

TasquesDAOHibernate.java

public List<Tasca> getTasques() {
        Session session = this.sessionFactory.getCurrentSession();
        try{
            Query query = session.createQuery("SELECT element FROM Tasca AS element");
            List result = query.list();
            return result;
        }catch(HibernateException ex){
            return null;
        }
    }

Я думаю, что это важные файлы. Я перепробовал много вещей, и я всегда получаю LazyInitializationException или

org.hibernate.HibernateException: Сессия Hibernate не связана с потоком, и конфигурация не позволяет создавать нетранзакционный сеанс здесь ...

Я не знаю, какой из них худший.

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 19 июня 2009

Проблема в том, что вы используете диспетчер транзакций: он запустит новый сеанс и, поскольку вы открыли его вручную, он также закроет его. Вам необходимо настроить управление транзакциями, используя конфигурацию Springs, чтобы все компоненты работали правильно вместе.

Использование перехватчика транзакций на бизнес-уровне (TasqueService).

1 голос
/ 28 января 2009

Я думаю, вам нужен фильтр на уровне web.xml :

<filter>
    <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

Только так Spring сможет узнать, когда отображается ваш вид.

0 голосов
/ 18 июня 2009

Чтобы ваш сеанс оставался открытым в течение всего запроса, вам необходимо добавить OpenSessionInViewFilter в Spring в ваш файл web.xml. Это специфично для hibernate3:

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
0 голосов
/ 12 февраля 2009

Вы можете попробовать использовать нативный перехватчик из Spring, взгляните на мой

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>

<bean id="txAttributeSource"
    class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
    <property name="properties">
        <props> <!-- this catches every method with the interceptor-->
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

<bean id="txInterceptor"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager">
        <ref local="transactionManager" />
    </property>
    <property name="transactionAttributeSource">
        <ref local="txAttributeSource" />
    </property>
</bean>

<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
        <list>
            <idref local="txInterceptor" />
        </list>
    </property>
    <property name="beanNames">
        <list> <!--this proxies every bean with the especified pattern -->
            <value>*BL</value>
        </list>
    </property>
</bean>
...