2016-04-05 18 views
1

を休止トランザクション管理は、私はXML-構成されたが、豆を開始している私の<code>Spring MVC</code> + <code>Hibernate</code>アプリで

<tx:annotation-driven transaction-manager="txManager"/> 

<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

そして、 CreateDefaultUserBeanは、SessionFactory

public class CreateDefaultUserBean { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Transactional 
    public void create() { 
     User adminUser = (User) sessionFactory.getCurrentSession().createCriteria(User.class).add(Restrictions.eq("login", username)).uniqueResult(); 
     // ... 
    } 
} 

だから、Could not obtain transaction-synchronized Session for current thread例外で失敗します

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'starter' defined in ServletContext resource [/WEB-INF/app-servlet.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1238) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1151) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:828) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) 
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

は私が間違って何をしているのですか?

+0

initメソッドが呼び出されたときにトランザクションプロキシがすでに作成されていることを保証するものではありません。したがって、initメソッドでのトランザクション作業は、ここで説明するように一般的には機能しません。http://stackoverflow.com/questions/17346679/transactional-on-postconstruct-method 'TransactionTemplate'を使うか、' PlatformTransactionManager'を使ってtxを管理する必要があります。 –

答えて

1
  • 現在のセッションは、@Transactionnal注釈付きメソッドに適用された専用のアスペクトを使用して作成され、現在のスレッドにバインドされます。
  • 春の側面は
  • ダイナミックプロキシはプロキシになるオブジェクトとは、それをカプセル化し、同じ契約を結んでいるJDK/CGLIBにダイナミックプロキシを使用しています。 SpringがあなたにBeanを注入すると、元のオブジェクトの代わりにプロキシが注入されます。

Springは(デフォルトのコンストラクタと最終的なinitメソッドを使用して)Beanをビルドし、プロキシにカプセル化します豆の場所。 initメソッドは直接呼び出され、transactionnalアスペクトは適用されません。現時点では現在のセッションもトランザクションも利用できません。ここより

同じ問題と回避策@Transactional on @PostConstruct method

+0

ありがとうあなたの説明のために。だから、私の回避策はここに正しい投稿ですか? – Andremoniy

+0

あなたの回避策では、セッションを作成してそれを現在のスレッドにバインドしますが、トランザクションのアスペクトはまだ適用されていません(トランザクションの注釈は無視されます)。 – Gab

+0

@ Gabだから問題の修正は何ですか? – praveen

0

回避策として、私はちょうどopenSession()代わりcurrentSession()を使用してのをできることを発見しました:

Session session = sessionFactory.openSession();

この場合@Transactional注釈も無用です。これは説明された構成でCould not obtain transaction-synchronized Session for current thread例外が発生するのはなぜだが、望ましい結果を得るのを助けるものではない。

+0

しかし、Springトランザクション管理を使用することの全ポイントは、セッションの作成と破棄を避けることではありませんか? – praveen

+0

@praveen私は同意する、それは私の質問だった。ギャブは、この場合に使用できると述べた。 – Andremoniy

+0

@Andremonlyあなたはこれを見ていただけますか?http://stackoverflow.com/questions/26562787/hibernateexception-couldnt-obtain-transaction-synchronized-session-for-currentスタックトレースにもTransactionInterceptorはありません。 – praveen

関連する問題