2016-03-09 5 views
1
  • Пружина 4.2.5.RELEASE
  • Спящего 5.1.0.Final
  • HSQLDB 2.3.3

Я попытался сделать проект интеграции демо как можно более простым. Но я столкнулся с проблемой org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread. Я искал Google и пробовал кучу методов, чтобы исправить это, но все еще не удалось.пружина 4 и 5 спящий режим интеграции: не удался получить транзакции синхронизированного сеанса для текущего потока

App.java

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; 
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; 
import org.springframework.orm.hibernate5.HibernateTransactionManager; 
import org.springframework.orm.hibernate5.LocalSessionFactoryBean; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.ContextLoaderListener; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration; 
import javax.sql.DataSource; 

@Configuration 
@ComponentScan(basePackages = "com.example") 
@EnableTransactionManagement 
public class App implements WebApplicationInitializer { 
    private static final Logger logger = LogManager.getLogger(App.class); 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
     context.register(App.class); 
     servletContext.addListener(new ContextLoaderListener(context)); 
     ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcherServlet", new DispatcherServlet(context)); 
     dispatcher.addMapping("/"); 
    } 

    @Bean 
    public DataSource dataSource() { 
     EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
     return builder.setType(EmbeddedDatabaseType.HSQL).build(); 
    } 

    @Bean 
    @Autowired 
    public LocalSessionFactoryBean sessionFactory(DataSource dataSource) { 
     LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean(); 
     factoryBean.setDataSource(dataSource); 
     factoryBean.setAnnotatedPackages("com.example"); 
     return factoryBean; 
    } 

    @Bean 
    @Autowired 
    public PlatformTransactionManager txManager(SessionFactory sessionFactory) { 
     return new HibernateTransactionManager(sessionFactory); 
    } 
} 

А вот мой hibernate.properties

hibernate.dialect = org.hibernate.dialect.HSQLDialect 
hibernate.hbm2ddl.auto = create 
hibernate.current_session_context_class = thread 
hibernate.show_sql = true 

UPDATE

Вот демонстрационный проект https://github.com/reliveyy/spring4-hibernate5-demo

Полный StackTrace

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
at org.springframework.orm.hibernate5.SpringSessionContext.currentSession(SpringSessionContext.java:132) ~[spring-orm-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final] 
at org.projw.HelloController.onSpringStartup(HelloController.java:51) ~[classes/:?] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_66] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_66] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_66] 
at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_66] 
at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:227) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:144) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:106) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:335) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:855) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4810) ~[catalina.jar:8.0.32] 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255) ~[catalina.jar:8.0.32] 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) ~[catalina.jar:8.0.32] 
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) ~[catalina.jar:8.0.32] 
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) ~[catalina.jar:8.0.32] 
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) ~[catalina.jar:8.0.32] 
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1692) ~[catalina.jar:8.0.32] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_66] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_66] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_66] 
at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_66] 
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) ~[tomcat-coyote.jar:8.0.32] 
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) ~[?:1.8.0_66] 
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) ~[?:1.8.0_66] 
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:465) ~[catalina.jar:8.0.32] 
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:415) ~[catalina.jar:8.0.32] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_66] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_66] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_66] 
at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_66] 
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) ~[tomcat-coyote.jar:8.0.32] 
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) ~[?:1.8.0_66] 
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) ~[?:1.8.0_66] 
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1471) ~[?:1.8.0_66] 
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) ~[?:1.8.0_66] 
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1312) ~[?:1.8.0_66] 
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1404) ~[?:1.8.0_66] 
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:832) ~[?:1.8.0_66] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_66] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_66] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_66] 
at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_66] 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323) ~[?:1.8.0_66] 
at sun.rmi.transport.Transport$1.run(Transport.java:200) ~[?:1.8.0_66] 
at sun.rmi.transport.Transport$1.run(Transport.java:197) ~[?:1.8.0_66] 
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_66] 
at sun.rmi.transport.Transport.serviceCall(Transport.java:196) ~[?:1.8.0_66] 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) ~[?:1.8.0_66] 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) ~[?:1.8.0_66] 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(TCPTransport.java:683) ~[?:1.8.0_66] 
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_66] 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) [?:1.8.0_66] 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_66] 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_66] 
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_66] 
+0

Пожалуйста, добавьте полную трассировку стека и код, в котором генерируется исключение. –

+0

@bitweaver Глядя на исключение, это произошло в 'HelloController.onSpringStartup (...)'. У вас есть активная транзакция при вызове метода onSpringStartup (..) '. Я думаю, что исключение состоит в том, что у вас нет активной транзакции при вызове 'onSpringStartup (...)'. Если да, аннотируйте этот метод с атрибутом '@ Transactional' и должны помочь. –

+0

@MadhusudanaReddySunnapu звучит разумно, но он будет вызывать org.springframework.transaction.TransactionSystemException: транзакция не успешно запущена. – bitweaver

ответ

1

Использование

factoryBean.setPackagesToScan("com.example");

вместо

factoryBean.setAnnotatedPackages("com.example");

указать пакет для сканирования.

Попробуйте open() и close()Session вместо этого кода

Session session = sessionFactory.getCurrentSession(); 
session.beginTransaction(); 
session.save(person); 
session.getTransaction().commit(); 
+0

все еще имеет проблему – bitweaver

+0

@bitweaver I update –

+0

'sessionFactory.openSession()' и 'session.close()' работает, но почему 'sessionFactory.getCurrentSession()' не удалось, и я уже настроил 'txManager',' @EnableTransactionManagement 'и' hibernate.current_session_context_class = thread' – bitweaver

0

Попробуйте добавить

@Transactional(propagation = Propagation.SUPPORTS,rollbackFor = Exception.class) 

к классам обслуживания. У меня была такая же проблема. Эта аннотация помогла мне.

Смежные вопросы