Hallo zusammen,
ich habe ein kleines Problem und vielleicht habt ihr ja eine Idee:
Wir nutzen hier im Projekt einen GenericDao / GenericDaoImpl mit einem EntityManager. Das Handling des EntityManagers haben wir Spring überlassen und injizieren uns selbigen mit @PersistenceContext in den GenericDaoImpl. Bisher existiert nur ein EntityManager als protected Attribut in GenericDaoImpl.
Das Problem ist nun, dass beim Laden von Listen / Objekten mit Referenzen auf andere Listen, diese alle erst beim Zugriff geladen werden sollen (lazy loading). Dabei teilt mir Hibernate immer freundlich mit, dass keine Session vorhanden ist (failed to lazily initialize a collection, no session or session was closed). Um dies erst einmal zu umgehen, habe ich den EntityManager als Extended markiert (@PersistenceContext(type=PersistenceContextType.EXTENDED)). Das funktionierte bisher prima.
Nun habe ich einen DAO der keinem Entity zugeordnet ist und somit nicht von meinem GenericDao erbt. Damit hat dieser DAO einen eigenen EntityManager (?) und bringt sporadisch folgenden Fehler:
java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:47)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.afterCommit(ExtendedEntityManagerCreator.java:458)
...
Hat einer von euch eine Idee woran das liegen könnte?
Gruß Erik
Edit:
Ausschnitt dao-configuration:
[XML]<!-- EntityManagerFactory -->
<bean id="applEntityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="applDataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.default_schema">public</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">none</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.provider_class" >org.hibernate.cache.NoCacheProvider</prop>
</props>
</property>
</bean>[/XML]
Ausschnitt GenericDaoImpl:
ich habe ein kleines Problem und vielleicht habt ihr ja eine Idee:
Wir nutzen hier im Projekt einen GenericDao / GenericDaoImpl mit einem EntityManager. Das Handling des EntityManagers haben wir Spring überlassen und injizieren uns selbigen mit @PersistenceContext in den GenericDaoImpl. Bisher existiert nur ein EntityManager als protected Attribut in GenericDaoImpl.
Das Problem ist nun, dass beim Laden von Listen / Objekten mit Referenzen auf andere Listen, diese alle erst beim Zugriff geladen werden sollen (lazy loading). Dabei teilt mir Hibernate immer freundlich mit, dass keine Session vorhanden ist (failed to lazily initialize a collection, no session or session was closed). Um dies erst einmal zu umgehen, habe ich den EntityManager als Extended markiert (@PersistenceContext(type=PersistenceContextType.EXTENDED)). Das funktionierte bisher prima.
Nun habe ich einen DAO der keinem Entity zugeordnet ist und somit nicht von meinem GenericDao erbt. Damit hat dieser DAO einen eigenen EntityManager (?) und bringt sporadisch folgenden Fehler:
java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:47)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization.afterCommit(ExtendedEntityManagerCreator.java:458)
...
Hat einer von euch eine Idee woran das liegen könnte?
Gruß Erik
Edit:
Ausschnitt dao-configuration:
[XML]<!-- EntityManagerFactory -->
<bean id="applEntityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="applDataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.default_schema">public</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">none</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.provider_class" >org.hibernate.cache.NoCacheProvider</prop>
</props>
</property>
</bean>[/XML]
Ausschnitt GenericDaoImpl:
Java:
public class GenericDaoImpl<T, K> implements GenericDao<T, K> {
@PersistenceContext(type=PersistenceContextType.EXTENDED)
protected EntityManager em;
protected Class<T> clazz;
...
}