2011-01-06 9 views
4

nicht geöffnet werden Ich wollte @Transactional auf meinen Diensten anstelle meiner DAOs ... festlegen, um Transaktion zu öffnen und in der Lage zu sein, einige faule Auflistungen innerhalb meiner Dienste zu verwenden, ohne einige "LazyInitializationException" zu erhalten.Spring-Transaktion konnte auf Dienst

Bis jetzt waren die @Transactional auf den DAOs, und Transaktionen wurden geöffnet und geschlossen, wenn Sie in die DAOs eintreten und diese verlassen.

Jetzt, mit @Transactional auf meine Dienste, sind die Transaktionen nicht einmal geöffnet. Also ruft der Service das DAO ohne Transaktion auf und wir haben die folgende Ausnahme: org.hibernate.SessionException: Sitzung ist geschlossen!

Wir JPA über Hibernate verwenden, hier ist ein Auszug aus unserer Konfiguration:

<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, vielen Dank für Ihre replys/Bemerkungen: Also, ich bin im Großen und Ganzen Dienst die @Transactional erklärt (Implementierung und nicht Schnittstelle) und nicht auf Methoden, um sicher zu sein, dass die @Transactional für alle gilt.

@Transactional 
public class MyServiceImpl implements MyService { 
    public void method1(){...} 
    public void method2(){...} 
} 

Ich gebe Ihnen auch die Art und Weise meine DAOs konfiguriert sind, sie alle die folgende Klasse erweitern:

public abstract class JpaDAOSupport { 
    protected EntityManager em; 
    @PersistenceContext(type = PersistenceContextType.TRANSACTION) 
    public void setEm(EntityManager em) { 
    this.em = em; 
    } 
} 

EDIT2: ich meine Bewerbung um nur 1 Service haben vereinfacht und 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 Konfigurationsdatei:

<?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> 

Bitte beachte, dass ich Zugriff auf das Attribut "mode" nicht für tx haben: Anmerkung -Gefahren.

Hier sind die Feder anmeldet Modus DEBUG der Inbetriebnahme:

[...] 
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 [[email protected]96] 
ework.web.context.support.XmlWebApplicationContext Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.[email protected]1335207] 
ework.ui.context.support.UiApplicationContextUtils Unable to locate ThemeSource with name 'themeSource': using default [o[email protected]6bbe7] 
k.beans.factory.support.DefaultListableBeanFactory Pre-instantiating singletons in org.s[email protected]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 [[email protected]] 
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.s[email protected]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! 

Ich mag würde verstehen, warum die Geschäfte nicht geöffnet werden, und wie könnte ich dieses Problem lösen?

Danke,

+2

Die Konfiguration können Sie die Liste korrekt und mit '@ Transactional' in der Dienstschicht scheint, ist eine bewährte Methode. Bis jetzt scheint alles in Ordnung, Sie müssen mehr Code (Java und/oder XML) zeigen, damit wir den Fehler finden –

+1

Wenn die Anwendung gestartet wird, was wird von AnnotationTransactionAttributeSource (bei DEBUG) protokolliert? Sie sollten etwas wie ... anzeigen Hinzufügen der transaktionalen Methode 'method1' mit Attribut: PROPAGATION_REQUIRED, ISOLATION_DEFAULT, readOnly; '' – ptomli

+0

Stellen Sie außerdem sicher, dass Ihr Dienst im selben Anwendungskontext deklariert ist wie ''. – axtavt

Antwort

6

Ok, in der Tat die Probleme waren

  • Config Problem
  • Transaktionen können nicht auf der init-Methode openned werden, da kein (Transaktions-) Proxy erstellt wird noch.

Für 1 .:

<!-- transaction manager for use with a single JPA EntityManagerFactory for transactional data access to a single datasource --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
    p:entityManagerFactory-ref="entityManagerFactory" 
/> 

<!-- uses the persistence unit defined in the META-INF/persistence.xml JPA configuration file --> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
p:dataSource-ref="dataSource"> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
     </props> 
    </property> 
</bean> 


<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
    p:driverClassName="${dataSource.driverClassName}" 
    p:url="${dataSource.url}" 
    p:username="${dataSource.username}" 
    p:password="${dataSource.password}" 
/> 

etwa 2.:

  • eine TransactionTemplate mit
  • einen ApplicationListener registrieren und aus den oben genannten Gründen für ContextRefreshedEvent
6

Klingt wie es möglicherweise einer der folgenden sein könnte:

  1. Ihre @Transactional Anmerkung an einer Schnittstelle ist, und Sie die falsche Art von Proxy

  2. Ihre Rufen Sie die @Transactional Methode intern

@Transactional docs

Frühling empfiehlt, nur konkrete Klassen (und Methoden der konkreten Klassen) mit der @Transactional Anmerkung Anmerkungen versehen, wie zu annotieren Schnittstellen gegenüber. Sie können die Annotation @Transactional sicher auf eine Schnittstelle (oder eine Schnittstellenmethode) setzen, aber dies funktioniert nur so, wie Sie es erwarten würden, wenn Sie interface-basierte Proxies verwenden. Die Tatsache, dass Java-Annotationen nicht von Schnittstellen geerbt werden, bedeutet, dass bei Verwendung von klassenbasierten Proxys (proxy-target-class="true") oder webbasierten Aspekten (mode="aspectj") die Transaktionseinstellungen von der Proxy- und Webinfrastruktur und dem Objekt nicht erkannt werden wird nicht in einen Transaktions-Proxy eingebunden, was ausgesprochen schlecht wäre.

Hinweis Im Proxy-Modus (Standardeinstellung) werden nur externe Methodenaufrufe abgefangen, die über den Proxy eingehen. Dies bedeutet, dass Selbstaufruf, dh eine Methode innerhalb des Zielobjekts, die eine andere Methode des Zielobjekts aufruft, selbst dann nicht zur tatsächlichen Transaktion führt, wenn die aufgerufene Methode mit @Transactional markiert ist.

EDIT: Sie sollten auch die Dokumente für die LocalEntityManagerFactoryBean überprüfen, die Sie verwenden. Aufgrund meiner schnellen Lektüre scheint es, dass Sie eine Eigenschaft vermissen, die möglicherweise benötigt wird. Es erwähnt auch einige Besonderheiten des Webens, die hier eine Rolle spielen könnten.

Spring ORM JPA LocalEntityManagerFactoryBean docs

0

Apart hören, könnte dies auch ein Problem mit JRE-Version sein. Eigentlich habe ich das gleiche erlebt. Die Anwendung wurde ordnungsgemäß in JRE 6 ausgeführt, aber als ich zu JRE 7 migrierte, wurde diese Ausnahme ausgelöst.

Lösung: Angegebene Tomcat JRE 6 explizit zu verwenden (mit Eclipse) anstelle von JRE 7

Verwandte Themen