I wanted to set @Transactional
on my services instead of my DAOs... in order to open transaction and be able to use some lazy collections within my services without getting some "LazyInitializationException".
Untill now the @Transactional
were on the DAOs, and transactions were opened and closed when entering in the DAOs and exiting from them.
Now, with @Transactional
on my services, transactions are not even opened. So the service call the DAO with no transaction opened and we got the folowing exception: org.hibernate.SessionException: Session is closed!
We're using JPA over Hibernate, here is an extract from our configuration:
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven />
EDIT, thanks for your replys/comments: So, i'm declaring the @Transactional on the whole service (implementation and not interface) and not on methods in order to be sure that the @Transactional will apply to all.
@Transactional
public class MyServiceImpl implements MyService {
public void method1(){...}
public void method2(){...}
}
I also give you the way my DAOs are configured, they all extend the following class:
public abstract class JpaDAOSupport {
protected EntityManager em;
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
public void setEm(EntityManager em) {
this.em = em;
}
}
EDIT2: I simplified my application in order to have only 1 service, and 1 DAO.
MyService:
@Transactional
public class MyServiceImpl implements MyService {
private MyDAO myDAO;
public void setMyDAO(MyDAO myDAO) {
this.myDAO = myDAO;
}
@Override
public void method1() {
List<String> things = myDAO.getAll();
System.out.println("Test size: " + things.size());
}
@Override
public void method2() {
List<String> things = myDAO.getAll();
for (String thing : things) {
System.out.println(thing);
}
}
}
MyDAO
@Repository
public class MyDAOImpl extends JpaDAOSupport implements MyDAO {
@SuppressWarnings("unchecked")
@Override
public List<String> getAll() {
Query query = em.createQuery("FROM " + Cfg.class.getName());
List<Cfg> result = query.getResultList();
List<String> realResult = new ArrayList<String>();
for (Cfg cfg : result) {
realResult.add(cfg.getKey());
}
return realResult;
}
}
Persistence config file:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="my.package.dao.MyDAO" class="my.package.dao.jpa.MyDAOImpl" />
<bean id="my.package.service.MyService" class="my.package.service.impl.MyServiceImpl" init-method="method1">
<property name="myDAO" ref="my.package.dao.MyDAO" />
</bean>
</beans>
Note that i don't have access to the attribute "mode" for tx:annotation-driven.
Here are the spring logs in mode DEBUG of the start up:
[...]
k.beans.factory.support.DefaultListableBeanFactory Creating shared instance of singleton bean 'entityManagerFactory'
k.beans.factory.support.DefaultListableBeanFactory Creating instance of bean 'entityManagerFactory'
k.beans.factory.support.DefaultListableBeanFactory Eagerly caching bean 'entityManagerFactory' to allow for resolving potential circular references
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [org.springframework.orm.jpa.LocalEntityManagerFactoryBean]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [org.springframework.orm.jpa.LocalEntityManagerFactoryBean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'beanClassLoader' of type [java.lang.ClassLoader]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'dataSource' of type [javax.sql.DataSource]
g.springframework.beans.CachedIntrospectionResults Found bean property 'entityManagerFactoryInterface' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'entityManagerInterface' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'jpaDialect' of type [org.springframework.orm.jpa.JpaDialect]
g.springframework.beans.CachedIntrospectionResults Found bean property 'jpaProperties' of type [java.util.Properties]
g.springframework.beans.CachedIntrospectionResults Found bean property 'jpaPropertyMap' of type [java.util.Map]
g.springframework.beans.CachedIntrospectionResults Found bean property 'jpaVendorAdapter' of type [org.springframework.orm.jpa.JpaVendorAdapter]
g.springframework.beans.CachedIntrospectionResults Found bean property 'nativeEntityManagerFactory' of type [javax.persistence.EntityManagerFactory]
g.springframework.beans.CachedIntrospectionResults Found bean property 'object' of type [javax.persistence.EntityManagerFactory]
g.springframework.beans.CachedIntrospectionResults Found bean property 'objectType' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'persistenceProvider' of type [javax.persistence.spi.PersistenceProvider]
g.springframework.beans.CachedIntrospectionResults Found bean property 'persistenceProviderClass' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'persistenceUnitInfo' of type [javax.persistence.spi.PersistenceUnitInfo]
g.springframework.beans.CachedIntrospectionResults Found bean property 'persistenceUnitName' of type [java.lang.String]
g.springframework.beans.CachedIntrospectionResults Found bean property 'singleton' of type [boolean]
k.beans.factory.support.DefaultListableBeanFactory Invoking afterPropertiesSet() on bean with name 'entityManagerFactory'
ingframework.orm.jpa.LocalEntityManagerFactoryBean Building JPA EntityManagerFactory for persistence unit 'null'
ework.web.context.support.XmlWebApplicationContext Bean 'entityManagerFactory' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
k.beans.factory.support.DefaultListableBeanFactory Finished creating instance of bean 'entityManagerFactory'
k.beans.factory.support.DefaultListableBeanFactory Finished creating instance of bean 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'
k.beans.factory.support.DefaultListableBeanFactory Creating shared instance of singleton bean 'org.springframework.aop.config.internalAutoProxyCreator'
k.beans.factory.support.DefaultListableBeanFactory Creating instance of bean 'org.springframework.aop.config.internalAutoProxyCreator'
org.springframework.core.CollectionFactory Creating [java.util.concurrent.ConcurrentHashMap]
k.beans.factory.support.DefaultListableBeanFactory Eagerly caching bean 'org.springframework.aop.config.internalAutoProxyCreator' to allow for resolving potential circular references
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator]
g.springframework.beans.CachedIntrospectionResults Found bean property 'advisorAdapterRegistry' of type [org.springframework.aop.framework.adapter.AdvisorAdapterRegistry]
g.springframework.beans.CachedIntrospectionResults Found bean property 'applyCommonInterceptorsFirst' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'beanClassLoader' of type [java.lang.ClassLoader]
g.springframework.beans.CachedIntrospectionResults Found bean property 'beanFactory' of type [org.springframework.beans.factory.BeanFactory]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'customTargetSourceCreators' of type [[Lorg.springframework.aop.framework.autoproxy.TargetSourceCreator;]
g.springframework.beans.CachedIntrospectionResults Found bean property 'exposeProxy' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'frozen' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'interceptorNames' of type [[Ljava.lang.String;]
g.springframework.beans.CachedIntrospectionResults Found bean property 'opaque' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'optimize' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'order' of type [int]
g.springframework.beans.CachedIntrospectionResults Found bean property 'proxyClassLoader' of type [java.lang.ClassLoader]
g.springframework.beans.CachedIntrospectionResults Found bean property 'proxyTargetClass' of type [boolean]
k.beans.factory.support.DefaultListableBeanFactory Finished creating instance of bean 'org.springframework.aop.config.internalAutoProxyCreator'
ework.web.context.support.XmlWebApplicationContext Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@7d2796]
ework.web.context.support.XmlWebApplicationContext Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@1335207]
ework.ui.context.support.UiApplicationContextUtils Unable to locate ThemeSource with name 'themeSource': using default [org.springframework.ui.context.support.ResourceBundleThemeSource@6bbe7]
k.beans.factory.support.DefaultListableBeanFactory Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1989b5: defining beans [org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,entityManagerFactory,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,my.package.dao.MyDAO,my.package.service.MyService]; root of factory hierarchy
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0'
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'entityManagerFactory'
k.beans.factory.support.DefaultListableBeanFactory Creating shared instance of singleton bean 'transactionManager'
k.beans.factory.support.DefaultListableBeanFactory Creating instance of bean 'transactionManager'
k.beans.factory.support.DefaultListableBeanFactory Eagerly caching bean 'transactionManager' to allow for resolving potential circular references
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [org.springframework.orm.jpa.JpaTransactionManager]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [org.springframework.orm.jpa.JpaTransactionManager]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'dataSource' of type [javax.sql.DataSource]
g.springframework.beans.CachedIntrospectionResults Found bean property 'defaultTimeout' of type [int]
g.springframework.beans.CachedIntrospectionResults Found bean property 'entityManagerFactory' of type [javax.persistence.EntityManagerFactory]
g.springframework.beans.CachedIntrospectionResults Found bean property 'failEarlyOnGlobalRollbackOnly' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'globalRollbackOnParticipationFailure' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'jpaDialect' of type [org.springframework.orm.jpa.JpaDialect]
g.springframework.beans.CachedIntrospectionResults Found bean property 'jpaProperties' of type [java.util.Properties]
g.springframework.beans.CachedIntrospectionResults Found bean property 'jpaPropertyMap' of type [java.util.Map]
g.springframework.beans.CachedIntrospectionResults Found bean property 'nestedTransactionAllowed' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'resourceFactory' of type [java.lang.Object]
g.springframework.beans.CachedIntrospectionResults Found bean property 'rollbackOnCommitFailure' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'transactionSynchronization' of type [int]
g.springframework.beans.CachedIntrospectionResults Found bean property 'transactionSynchronizationName' of type [java.lang.String]
g.springframework.beans.CachedIntrospectionResults Found bean property 'validateExistingTransaction' of type [boolean]
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'entityManagerFactory'
k.beans.factory.support.DefaultListableBeanFactory Creating shared instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
k.beans.factory.support.DefaultListableBeanFactory Creating instance of bean 'org.springframework.transaction.config.internalTransactionAdvisor'
rk.autoproxy.InfrastructureAdvisorAutoProxyCreator Did not attempt to auto-proxy infrastructure class [org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]
k.beans.factory.support.DefaultListableBeanFactory Eagerly caching bean 'org.springframework.transaction.config.internalTransactionAdvisor' to allow for resolving potential circular references
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]
g.springframework.beans.CachedIntrospectionResults Found bean property 'advice' of type [org.aopalliance.aop.Advice]
g.springframework.beans.CachedIntrospectionResults Found bean property 'adviceBeanName' of type [java.lang.String]
g.springframework.beans.CachedIntrospectionResults Found bean property 'beanFactory' of type [org.springframework.beans.factory.BeanFactory]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'classFilter' of type [org.springframework.aop.ClassFilter]
g.springframework.beans.CachedIntrospectionResults Found bean property 'order' of type [int]
g.springframework.beans.CachedIntrospectionResults Found bean property 'perInstance' of type [boolean]
g.springframework.beans.CachedIntrospectionResults Found bean property 'pointcut' of type [org.springframework.aop.Pointcut]
g.springframework.beans.CachedIntrospectionResults Found bean property 'transactionAttributeSource' of type [org.springframework.transaction.interceptor.TransactionAttributeSource]
k.beans.factory.support.DefaultListableBeanFactory Creating shared instance of singleton bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
k.beans.factory.support.DefaultListableBeanFactory Creating instance of bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
org.springframework.core.CollectionFactory Creating [java.util.concurrent.ConcurrentHashMap]
k.beans.factory.support.DefaultListableBeanFactory Eagerly caching bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0' to allow for resolving potential circular references
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
k.beans.factory.support.DefaultListableBeanFactory Finished creating instance of bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
k.beans.factory.support.DefaultListableBeanFactory Finished creating instance of bean 'org.springframework.transaction.config.internalTransactionAdvisor'
k.beans.factory.support.DefaultListableBeanFactory Invoking afterPropertiesSet() on bean with name 'transactionManager'
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
k.beans.factory.support.DefaultListableBeanFactory Finished creating instance of bean 'transactionManager'
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'org.springframework.aop.config.internalAutoProxyCreator'
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
k.beans.factory.support.DefaultListableBeanFactory Creating shared instance of singleton bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0'
k.beans.factory.support.DefaultListableBeanFactory Creating instance of bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0'
rk.autoproxy.InfrastructureAdvisorAutoProxyCreator Did not attempt to auto-proxy infrastructure class [org.springframework.transaction.interceptor.TransactionInterceptor]
k.beans.factory.support.DefaultListableBeanFactory Eagerly caching bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0' to allow for resolving potential circular references
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [org.springframework.transaction.interceptor.TransactionInterceptor]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [org.springframework.transaction.interceptor.TransactionInterceptor]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'transactionAttributeSource' of type [org.springframework.transaction.interceptor.TransactionAttributeSource]
g.springframework.beans.CachedIntrospectionResults Found bean property 'transactionAttributeSources' of type [[Lorg.springframework.transaction.interceptor.TransactionAttributeSource;]
g.springframework.beans.CachedIntrospectionResults Found bean property 'transactionAttributes' of type [java.util.Properties]
g.springframework.beans.CachedIntrospectionResults Found bean property 'transactionManager' of type [org.springframework.transaction.PlatformTransactionManager]
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'transactionManager'
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
k.beans.factory.support.DefaultListableBeanFactory Invoking afterPropertiesSet() on bean with name 'org.springframework.transaction.interceptor.TransactionInterceptor#0'
k.beans.factory.support.DefaultListableBeanFactory Finished creating instance of bean 'org.springframework.transaction.interceptor.TransactionInterceptor#0'
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
k.beans.factory.support.DefaultListableBeanFactory Creating shared instance of singleton bean 'my.package.dao.MyDAO'
k.beans.factory.support.DefaultListableBeanFactory Creating instance of bean 'my.package.dao.MyDAO'
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [my.package.dao.jpa.JpaDAOSupport]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [my.package.dao.jpa.JpaDAOSupport]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'em' of type [javax.persistence.EntityManager]
amework.beans.factory.annotation.InjectionMetadata Found injected method on class [my.package.dao.jpa.MyDAOImpl]: PersistenceElement for public void my.package.dao.jpa.JpaDAOSupport.setEm(javax.persistence.EntityManager)
k.beans.factory.support.DefaultListableBeanFactory Eagerly caching bean 'my.package.dao.MyDAO' to allow for resolving potential circular references
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [my.package.dao.jpa.MyDAOImpl]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [my.package.dao.jpa.MyDAOImpl]
g.springframework.beans.CachedIntrospectionResults Found bean property 'all' of type [java.util.List]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'em' of type [javax.persistence.EntityManager]
amework.beans.factory.annotation.InjectionMetadata Processing injected method of bean 'my.package.dao.MyDAO': PersistenceElement for public void my.package.dao.jpa.JpaDAOSupport.setEm(javax.persistence.EntityManager)
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'entityManagerFactory'
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
org.springframework.core.CollectionFactory Creating [java.util.concurrent.ConcurrentHashMap]
g.springframework.aop.framework.JdkDynamicAopProxy Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [my.package.dao.jpa.MyDAOImpl@1298826]
k.beans.factory.support.DefaultListableBeanFactory Finished creating instance of bean 'my.package.dao.MyDAO'
k.beans.factory.support.DefaultListableBeanFactory Creating shared instance of singleton bean 'my.package.service.MyService'
k.beans.factory.support.DefaultListableBeanFactory Creating instance of bean 'my.package.service.MyService'
k.beans.factory.support.DefaultListableBeanFactory Eagerly caching bean 'my.package.service.MyService' to allow for resolving potential circular references
g.springframework.beans.CachedIntrospectionResults Getting BeanInfo for class [my.package.service.impl.MyServiceImpl]
g.springframework.beans.CachedIntrospectionResults Caching PropertyDescriptors for class [my.package.service.impl.MyServiceImpl]
g.springframework.beans.CachedIntrospectionResults Found bean property 'class' of type [java.lang.Class]
g.springframework.beans.CachedIntrospectionResults Found bean property 'myDAO' of type [my.package.dao.MyDAO]
k.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'my.package.dao.MyDAO'
k.beans.factory.support.DefaultListableBeanFactory Invoking init method 'method1' on bean with name 'my.package.service.MyService'
anagerCreator$SharedEntityManagerInvocationHandler Creating new EntityManager for shared EntityManager invocation
.springframework.orm.jpa.EntityManagerFactoryUtils Closing JPA EntityManager
k.beans.factory.support.DefaultListableBeanFactory Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1989b5: defining beans [org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,entityManagerFactory,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,my.package.dao.MyDAO,my.package.service.MyService]; root of factory hierarchy
k.beans.factory.support.DefaultListableBeanFactory Retrieved dependent beans for bean 'my.package.dao.MyDAO': [my.package.service.MyService]
k.beans.factory.support.DefaultListableBeanFactory Retrieved dependent beans for bean 'transactionManager': [org.springframework.transaction.interceptor.TransactionInterceptor#0]
k.beans.factory.support.DefaultListableBeanFactory Retrieved dependent beans for bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0': [org.springframework.transaction.config.internalTransactionAdvisor, org.springframework.transaction.interceptor.TransactionInterceptor#0]
k.beans.factory.support.DefaultListableBeanFactory Retrieved dependent beans for bean 'entityManagerFactory': [transactionManager, my.package.dao.MyDAO]
mework.beans.factory.support.DisposableBeanAdapter Invoking destroy() on bean with name 'entityManagerFactory'
ingframework.orm.jpa.LocalEntityManagerFactoryBean Closing JPA EntityManagerFactory for persistence unit 'null'
org.springframework.web.context.ContextLoader Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'my.package.service.MyService' defined in class path resource [config/persistenceContext.xml]: Invocation of init method failed; nested exception is org.springframework.orm.jpa.JpaSystemException: org.hibernate.SessionException: Session is closed!; nested exception is javax.persistence.PersistenceException: org.hibernate.SessionException: Session is closed!
I'd like to understand why the transactions are not opened, and how could i solve this problem ?
Thanks,
Sounds like it could possibly be one of:
Your @Transactional
annotation is on an interface, and you're using the wrong type of proxy
Your calling the @Transactional
method internally
@Transactional
docs
Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the
@Transactional
annotation, as opposed to annotating interfaces. You certainly can place the@Transactional
annotation on an interface (or an interface method), but this works only as you would expect it to if you are using interface-based proxies. The fact that Java annotations are not inherited from interfaces means that if you are using class-based proxies (proxy-target-class="true"
) or the weaving-based aspect (mode="aspectj"
), then the transaction settings are not recognized by the proxying and weaving infrastructure, and the object will not be wrapped in a transactional proxy, which would be decidedly bad.Note In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual transaction at runtime even if the invoked method is marked with
@Transactional
.
EDIT: You should also check the docs for the LocalEntityManagerFactoryBean you're using. Based on my quick read there, it seems you're missing a property that might be needed. It also mentions some specifics about weaving, which may be playing a role here.
Spring ORM JPA LocalEntityManagerFactoryBean docs
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With