Lazy Loading com Spring e Hibernate

0 respostas
lm.moreira

Olá a todos.

Inicialmente eu recebia este (org.hibernate.LazyInitializationException: could not initialize proxy - no Session) erro ao chamar um get de alguma entidade com o FetchType=Lazy.

Bom pesquisando muito encontrei diversos artigos sobre OpenSessionInViewInterceptor e OpenSessionInViewFilter. Ambas as solução são apenas para o sistema rodando. Para teste unitários por exemplo elas não funcionam.

Então eu gostaria de implementar uma solução que funcionasse de vez. Pros dois sem problemas.

Encontrei links como estes que me mandaram criar Interceptors http://www.jroller.com/agileanswers/entry/opensessioninviewinterceptor_for_quartz_jobs_under

Foi o que fiz, No meu Spring.xml coloquei uma transaction e um hibernateinterceptor como o artigo mesmo diz.

Debugando ví que meu teste unitário realmente entra na classe HibernateInterceptor mas não executa nenhum método.

O que eu preciso é que este interceptor funcione para os lazys e pelo que entendi você tem que indicar um TransactionProxyFactoryBean para o bean que gera os daos no meu caso é um genericDao.

Mas de fato não funciona.

Alguem tem uma idéia.

Meu Spring.xml limpo depois de vários testes ficou assim

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
                           http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
                           http://www.springframework.org/schema/util
                           http://www.springframework.org/schema/util/spring-util-2.5.xsd
                           http://www.springframework.org/schema/jee
                           http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-2.5.xsd"
        default-autowire="byName">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${hibernate.connection.driver_class}" />
        <property name="url" value="${hibernate.connection.url}" />
        <property name="username" value="${hibernate.connection.username}" />
        <property name="password" value="${hibernate.connection.password}" />
    </bean>

    <bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <value>classpath:hibernate.properties</value>
        </property>
    </bean>

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="properties" ref="hibernateProperties" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties" ref="hibernateProperties" />
        <property name="packagesToScan">
            <list>
                <value>br.unimed.entity</value>
            </list>
        </property>
    </bean>

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

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

    <context:component-scan base-package="br.unimed.controller" />
    <context:component-scan base-package="br.unimed.dao"  />
    <context:component-scan base-package="br.unimed.business" />
    <context:component-scan base-package="br.unimed.converter" />
    <aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>

Minha genericDao não passa de uma implementação de HibernateDaoSupport anotado com @Repository(value = “genericDao”).

Alguem tem uma luz, pra me dar se possivel, valeo

Criado 10 de junho de 2010
Respostas 0
Participantes 1