Transaction / Session Problem

MySelV

Aktives Mitglied
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:
Java:
public class GenericDaoImpl<T, K> implements GenericDao<T, K> {
	
    	
	@PersistenceContext(type=PersistenceContextType.EXTENDED)
	protected EntityManager em;
	
	protected Class<T> clazz;
	...
}
 
du hast keinen transaction-manager gesetzt. Sobald du schreibst brauchst du einen.

und dann musst du @Transactional nutzen
 
Zuletzt bearbeitet von einem Moderator:
Hups vergessen zu kopieren:
[XML]
<tx:annotation-driven proxy-target-class="false"
transaction-manager="txManager" />

<bean id="txManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="applEntityManagerFactory" />
<property name="dataSource" ref="applDataSource" />
</bean>[/XML]

@Transactional benutze ich - allerdings im Moment nur auf dem Interface. Muss ich die einzelnen Methoden auch mit @Transactional annotieren?
 
@Transactional benutze ich - allerdings im Moment nur auf dem Interface.
Genau da sollte man es imho nicht machen 😉
Jedenfalls funzt da so nicht, ansonsten sollte man Interfaces sauber von dreckigen Implementierungsdetails halten 😉
 
Tja lange gedacht es geht gut, bin ich nun doch wieder da 🙁

@Transactional ist inzwischen vom Interface an die Methoden in den Implementierungen gewandert und das hat bisher auch gut funktioniert. In einigen seltenen Fällen habe ich nun immernoch das Problem, dass ich eine IllegalStateException: Transaction not active bekomme.

Interessant ist, dass das Problem nur beim ersten Aufruf auftritt. Mit anderen Worten - ich rufe (mehrere) Methoden der DAO's in einem Workflow auf und bekomme beim ersten Zugriff die obige Fehlermeldung. Wenn ich danach mehrfach ( > 10x ) das gleiche Aufrufe funktioniert es jedes Mal tadellos.

Jemand eine Idee?

€dit: Gleich nochmal ein Nachtrag: Die Exception fliegt immer in der gleichen Methode / dem gleichen Aufruf des EntityManagers.

Edit2: Es geht. Fehler war nicht die Transaktion sondern ein Nullpointer bei der Übergabe an einen Parameter fürs Query. Hibernate hat wohl einfach eine "naheliegende" Fehlermeldung geworfen
 
Zuletzt bearbeitet:

Zurück
Oben