Konfigurace JPA ve Spring s hibernate OpenSessionInViewInterceptor

Jiří Hradil jirka na hradil.cz
Sobota Leden 24 11:39:12 CET 2009


Ahoj,

díky za odpovědi. Řeším stejný problém jako Fafi a i při použití
org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor
 či org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
nefunguje načítání kolekcí přes FetchType.LAZY.

Testcase je jednoduchý, nejdříve persistuji záznam, poté ho načtu přes
ID a zkusím "donačíst" lazy kolekci:

//ulozeni osoby s 2 emaily:

//nacteni prave ulozene osoby s 2 emaily
Person p = dao.findById(IDCKO); //bezi v 1 transakci

assertEquals(2, p.getEmails().size()); //tady to vyhodi vyjimku
org.hibernate.LazyInitializationException: failed to lazily initialize
a collection of role: test.entity.Person.emails, no session or session
was closed

Entity manažer se uzavře po ukončení transakce ve findById a při
donačtení už nemá session:

Log:

Entity manažer se zavře po ukončení transakce a lazy loading kolekce
vždy skončí následovně:

DEBUG [main] (JDBCTransaction.java:134) - commit
DEBUG [main] (AbstractFlushingEventListener.java:134) - processing
flush-time cascades
DEBUG [main] (AbstractFlushingEventListener.java:177) - dirty checking
collections
DEBUG [main] (Collections.java:199) - Collection found:
[test.entity.Person.emails#5000], was:
[test.entity.Person.emails#5000] (uninitialized)
DEBUG [main] (AbstractFlushingEventListener.java:108) - Flushed: 0
insertions, 0 updates, 0 deletions to 1 objects
DEBUG [main] (AbstractFlushingEventListener.java:114) - Flushed: 0
(re)creations, 0 updates, 0 removals to 1 collections
DEBUG [main] (Printer.java:106) - listing entities:
DEBUG [main] (Printer.java:113) - test.entity.Person{id=5000,
name=Testovaci Osoba, emails=<uninitialized>}
DEBUG [main] (JDBCTransaction.java:227) - re-enabling autocommit
DEBUG [main] (JDBCTransaction.java:147) - committed JDBC Connection
DEBUG [main] (ConnectionManager.java:427) - aggressively releasing
JDBC connection
DEBUG [main] (ConnectionManager.java:464) - releasing JDBC connection
[ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0,
globally: 0)]
DEBUG [main] (AbstractPlatformTransactionManager.java:906) -
Triggering afterCommit synchronization
DEBUG [main] (AbstractPlatformTransactionManager.java:922) -
Triggering afterCompletion synchronization
DEBUG [main] (TransactionSynchronizationManager.java:315) - Clearing
transaction synchronization
DEBUG [main] (TransactionSynchronizationManager.java:232) - Removed
value [org.springframework.orm.jpa.EntityManagerHolder na e580e1] for key
[org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean na 16b6c55]
from thread [main]
DEBUG [main] (TransactionSynchronizationManager.java:232) - Removed
value [org.springframework.jdbc.datasource.ConnectionHolder na 14323d5]
for key [org.apache.commons.dbcp.BasicDataSource na 19cd75a] from thread
[main]
DEBUG [main] (JpaTransactionManager.java:534) - Closing JPA
EntityManager [org.hibernate.ejb.EntityManagerImpl na 498713] after
transaction
DEBUG [main] (EntityManagerFactoryUtils.java:313) - Closing JPA EntityManager
ERROR [main] (LazyInitializationException.java:42) - failed to lazily
initialize a collection of role: test.entity.Person.emails, no session
or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize
a collection of role: test.entity.Person.emails, no session or session
was closed

V příloze posílám zip testovacího projektu (naprosto minimální verze,
demonstrující problém).

Google je těchto otázek a údajných řešení plný, ale bohužel, ani po
dni hledání a testování se mi to nepodařilo rozchodit. Nemůžu přinutit
Entity manažera, aby mi podržel spojení po ukončení transakce.

Díky za nakopnutí, jsem si jistý, že jsem jen něco přehlédl v
konfiguraci. Jinak přece není možné, že by v JPA implementaci od
Hibernate nefungovalo Lazy loading :)

Jirka Hradil



2009/1/23 Ladislav Thon <ladicek na gmail.com>:
> Hibernate a JPA ani trochu nerozumím, ale neměl by se s JPA používat ve
> Springu spíš OpenEntityManagerInViewFilter, resp.
> OpenEntityManagerInViewInterceptor?
>
> LT
>
> 2009/1/23 Jozef Sevcik <sevcik na styxys.com>
>>
>> Funguje Vam to pri pouziti filtru ? :
>> <filter>
>> <filter-name>hibernateFilter</filter-name>
>> <filter-class>
>>  org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
>> </filter-class>
>> </filter>
>> <filter-mapping>
>>  <filter-name>hibernateFilter</filter-name>
>>  <url-pattern>/*</url-pattern>
>> </filter-mapping>
>>
>>
>> 2009/1/23 Jiří Hradil <jirka na hradil.cz>:
>> > Našel jsem zatím jen tohle propojení, ale bohužel nefunguje:
>> >
>> >    <bean id="sessionFactory" factory-bean="entityManagerFactory"
>> > factory-method="getSessionFactory" />
>> >
>> >    <bean name="openSessionInViewInterceptor"
>> >
>> > class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
>> >        <property name="sessionFactory">
>> >            <ref bean="sessionFactory"/>
>> >        </property>
>> >    </bean>
>> >
>> > Zdá se mi nějaké podezřelé, že jsem dosud nenašel funkční řešení. JPA
>> > je standard a Hibernate jeho nejpoužívanější implementace. Popis
>> > potíží s uzavíráním session při lazy fetching je plný Google, ale
>> > zatím nic nefunguje. Nikdo kombinaci JPA+Spring+Hibernate nepoužíváte?
>> > :)
>> >
>> > Jirka Hradil
>> >
>> >
>> > 2009/1/22 Ondřej Fafejta <ondrej.fafejta na kyberie.cz>:
>> >> Zdravím konferenci,
>> >>
>> >> používáme JPA a zkoušíme místo implementace toplink používat
>> >> implementaci od hibernate.
>> >> Přechod na jiného vendora proběhl docela bez problémů.
>> >>
>> >> Pokud jsme přešli na hibernate, tak přestala fungovat lazy
>> >> inicializace.
>> >> Vyhazuje se známá exception:
>> >> org.hibernate.LazyInitializationException ... no session or session was
>> >> closed
>> >>
>> >> Nedaří se mi zjistit, jak přidat k entityManageru (z JPA) session z
>> >> hibernate-u.
>> >> Na googlu jsem nic vhodného nenašel.
>> >>
>> >> Je vůbec možné přidat OpenSessionInViewInterceptor entityManageru?
>> >>
>> >> něco takového:
>> >>
>> >> <bean id="mySessionFactory"
>> >> class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
>> >>     <property name="dataSource" ref="dataSource"/>
>> >> </bean>
>> >>
>> >> <bean name="openSessionInViewInterceptor"
>> >>
>> >> class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
>> >>    <property name="sessionFactory">
>> >>        <ref bean="mySessionFactory"/>
>> >>    </property>
>> >> </bean>
>> >>
>> >> <bean id="entityManagerFactory"
>> >>
>> >> class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
>> >> ...
>> >>   <property name="hibernate.ejb.interceptor"
>> >> ref="openSessionInViewInterceptor" />
>> >>
>> >> (toto samozřejmě nefunguje, jinak bych sem nepsal ;-))
>> >>
>> >> Díky
>> >>
>> >> Fafi
>> >>
>> >
>>
>>
>>
>> --
>> S pozdravom / Best regards,
>>
>> Jozef Ševčík
>> sevcik na styxys.com
>>
>> +420 608 782 813
>> +420 222 364 769
>
>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: HibernateJpaMaven.zip
Type: application/zip
Size: 11413 bytes
Desc: [žádný popis není k dispozici]
URL: <http://amaio.cz/pipermail/konference/attachments/20090124/24584ab2/attachment.zip>


Další informace o konferenci Konference