"No session for current thread" after changing session access method

I am working on a Spring MVC project. I use Hibernate directly. No Session found for current thread error occurred in my project. I know that on stackoverflow and elsewhere on the Internet this error is very common. But I did not find a working solution for my problem.

I had an unresolved issue with the correct configuration of the Hibernate Factory session. I described it here: Is it possible to use a Hibernate Factory session declared in the DispatcherServlet context instead of hibernate.cfg.xml? But finally, I use the hibernate.cfg.xml file and also the Hibernate Factory session defined in the DispatcherServlet context file. I did some simple operations, such as persistent classes in a database. And everything was in order.

At the moment, my project has much in common with Spring MVC Hibernate . I added some annotations to my classes, and I created some new service classes.

The My ServletDispatcher context file contains the following definitions:

 <annotation-driven /> <context:annotation-config /> <context:component-scan base-package="finances.webapp" /> <!-- Data source --> <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /> <beans:property name="url" value="jdbc:mysql://localhost/finances" /> <beans:property name="username" value="root" /> <beans:property name="password" value="root" /> </beans:bean> <!-- Data source end --> <!-- Hibernate session factory --> <beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <beans:property name="dataSource"> <beans:ref bean="dataSource" /> </beans:property> <beans:property name="configLocation" value="classpath:hibernate.cfg.xml" /> </beans:bean> <!-- Hibernate session factory end --> <beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <beans:property name="sessionFactory" ref="sessionFactory" /> </beans:bean> <beans:bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <beans:property name="transactionManager" ref="transactionManager" /> <beans:property name="transactionAttributes"> <beans:props> <beans:prop key="save">PROPAGATION_REQUIRED</beans:prop> </beans:props> </beans:property> </beans:bean> 

In my pom.xml file, I have only these two dependencies according to ORM:

 <!-- Hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.1.4.Final</version> </dependency> <!-- EJB --> <dependency> <groupId>javax.ejb</groupId> <artifactId>ejb-api</artifactId> <version>3.0</version> <scope>provided</scope> </dependency> 

Maybe the problem is here? But before, I had no problems with missing packages.

This is my controller code:

 UsersEntity user2 = new UsersEntity("qwerty", "qwerty", true); usersService.addUser(user2); 

The No Session found for current thread problem occurred while calling the addUser() method.

My DAO class:

 @Repository public class UsersHome { @Autowired private SessionFactory sessionFactory; public void persist(UsersEntity transientInstance) { sessionFactory.getCurrentSession().persist(transientInstance); } } 

My service:

 @Service public class UsersService { @Autowired private UsersHome usersHome; @Transactional(propagation = Propagation.REQUIRED) public void addUser(UsersEntity user) { usersHome.persist(user); } } 

This code stops working when I have the body of the change method in the UsersHome class. I used to start a session before my action and end the session after my action. But using annotations and transactions, should it work? Please give me some advice.

EDIT

 <hibernate-configuration> <session-factory> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="connection.url">jdbc:mysql://localhost/finances</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <mapping class="finances.webapp.entities.AuthoritiesEntity"/> <mapping class="finances.webapp.entities.ExpensesEntity"/> <mapping class="finances.webapp.entities.ExpensesCategoriesEntity"/> <mapping class="finances.webapp.entities.ExpensesObjectsEntity"/> <mapping class="finances.webapp.entities.IncomesEntity"/> <mapping class="finances.webapp.entities.UsersEntity"/> </session-factory> </hibernate-configuration> 

EDIT No. 2

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usersService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private finances.webapp.dao.UsersHome finances.webapp.services.UsersService.usersHome; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usersHome': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory finances.webapp.dao.UsersHome.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/cfg/EJB3DTDEntityResolver 

EDIT No. 3

My root-context.xml 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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> </beans> 

And my whole spring-config.xml file:

 <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- DispatcherServlet Context: defines this servlet request-processing infrastructure --> <!-- Enables the Spring MVC @Controller programming model --> <annotation-driven /> <context:annotation-config /> <context:component-scan base-package="finances.webapp" /> <!-- Handles HTTP GET requests for resources by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <!--<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">--> <!--<beans:property name="definitions">--> <!--<beans:list>--> <!--<beans:value>/WEB-INF/tiles-definitions.xml</beans:value>--> <!--</beans:list>--> <!--</beans:property>--> <!--</beans:bean>--> <!--<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">--> <!--<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />--> <!--</beans:bean>--> <!-- Data source --> <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /> <beans:property name="url" value="jdbc:mysql://localhost/finances" /> <beans:property name="username" value="root" /> <beans:property name="password" value="root" /> </beans:bean> <!-- Data source end --> <!-- Hibernate session factory --> <beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <beans:property name="dataSource" ref="dataSource" /> <beans:property name="configLocation" value="classpath:hibernate.cfg.xml" /> </beans:bean> <!-- Hibernate session factory end --> <beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <beans:property name="sessionFactory" ref="sessionFactory" /> </beans:bean> <beans:bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <beans:property name="transactionManager" ref="transactionManager" /> <beans:property name="transactionAttributes"> <beans:props> <beans:prop key="save">PROPAGATION_REQUIRED</beans:prop> <beans:prop key="persist">PROPAGATION_REQUIRED</beans:prop> </beans:props> </beans:property> </beans:bean> </beans:beans> 
+4
source share
1 answer

Try removing the "transactionInterceptor", you already have the @Transaction attribute, as well as the <annotation-driven/> . Or add to the transaction an Interceptor key for the persist() method

 <beans:prop key="persist">PROPAGATION_REQUIRED</beans:prop> 

Perhaps this will help.

EDIT: I recreated your configuration and it works.

this is spring config:

 <?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd "> <context:annotation-config /> <context:component-scan base-package="finances.webapp" /> <jdbc:embedded-database id="dataSource" type="H2"/> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> </bean> <tx:annotation-driven /> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans> 

this is hibernate config:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="dialect">org.hibernate.dialect.H2Dialect</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping class="finances.webapp.bean.UsersEntity"/> </session-factory> </hibernate-configuration> 

dependency in pom.xml

 <properties> <org.springframework.version>3.1.0.RELEASE</org.springframework.version> <org.hibernate.version>4.1.4.Final</org.hibernate.version> </properties> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${org.hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${org.hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.5.6-Final</version> </dependency> <dependency> <groupId>javax.ejb</groupId> <artifactId>ejb-api</artifactId> <version>3.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <!--for test only --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.168</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.1.1</version> <scope>test</scope> </dependency> 

Block test:

 public class TestPersist { @org.testng.annotations.Test public void testPersistence() throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-context.xml"); Assert.assertNotNull(ctx); UsersService userService = ctx.getBean(UsersService.class); Assert.assertNotNull(userService); UsersEntity user2 = new UsersEntity(); user2.setEnable(true); user2.setLogin("querty"); user2.setName("user2"); userService.addUser(user2); } } 

and block output:

 Sep 8, 2012 2:55:37 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Refreshing org .springframework.context.support.ClassPathXmlApplicationContext@ 5d3ad33d: startup date [Sat Sep 08 14:55:37 MSK 2012]; root of context hierarchy Sep 8, 2012 2:55:37 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from class path resource [spring-context.xml] Sep 8, 2012 2:55:37 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-instantiating singletons in org.s pringframework.beans.factory.support.DefaultListableBeanFactory@ 6cb32ed4: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,usersHome,usersService,dataSource,sessionFactory,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,transactionManager,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy Sep 8, 2012 2:55:37 PM org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory initDatabase INFO: Creating embedded database 'dataSource' Sep 8, 2012 2:55:38 PM org.hibernate.annotations.common.Version <clinit> INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final} Sep 8, 2012 2:55:38 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {4.1.4.Final} Sep 8, 2012 2:55:38 PM org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found Sep 8, 2012 2:55:38 PM org.hibernate.cfg.Environment buildBytecodeProvider INFO: HHH000021: Bytecode provider name : javassist Sep 8, 2012 2:55:38 PM org.hibernate.cfg.Configuration configure INFO: HHH000044: Configuring from URL: file:/home/gr/dev/target/classes/hibernate.cfg.xml Sep 8, 2012 2:55:38 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide! Sep 8, 2012 2:55:38 PM org.hibernate.cfg.Configuration doConfigure INFO: HHH000041: Configured SessionFactory: null Sep 8, 2012 2:55:38 PM org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect Sep 8, 2012 2:55:38 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4 Sep 8, 2012 2:55:38 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) Sep 8, 2012 2:55:38 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> INFO: HHH000397: Using ASTQueryTranslatorFactory Sep 8, 2012 2:55:38 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000228: Running hbm2ddl schema update Sep 8, 2012 2:55:38 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000102: Fetching database metadata Sep 8, 2012 2:55:38 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000396: Updating schema Sep 8, 2012 2:55:38 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: HHH000262: Table not found: UsersEntity Sep 8, 2012 2:55:38 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: HHH000262: Table not found: UsersEntity Sep 8, 2012 2:55:39 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000232: Schema update complete Sep 8, 2012 2:55:39 PM org.springframework.orm.hibernate4.HibernateTransactionManager afterPropertiesSet INFO: Using DataSource [ org.springframework.jdbc.datasource.SimpleDriverDataSource@79ef3 ccd] of Hibernate SessionFactory for HibernateTransactionManager Hibernate: insert into UsersEntity (id, enable, login, name) values (null, ?, ?, ?) RemoteTestNG finishing: 2868 ms 
+2
source

Source: https://habr.com/ru/post/1205393/


All Articles