私はSpringMVCプロジェクトに取り組んでいます。私はHibernateを直接使用しています。No Session found for current thread
私のプロジェクトでエラーが発生しました。私はstackoverflowやウェブ上の他の場所でこのエラーが非常に一般的であることを知っています。しかし、私は自分の問題に対する実用的な解決策を見つけていません。
HibernateSessionFactoryの適切な構成で未解決の問題が発生しました。ここで説明しました:hibernate.cfg.xmlの代わりにDispatcherServletコンテキストで宣言されたHibernateセッションファクトリを使用できますか?しかし最後に、hibernate.cfg.xml
ファイルと、DispatcherServletコンテキストファイルで定義されたHibernateSessionFactoryを使用しています。データベースにクラスを永続化するなど、いくつかの簡単な操作を実行しました。そして、すべてが大丈夫でした。
現時点では、私のプロジェクトにはSpringMVCHibernateと多くの共通点があります。クラスにいくつかのアノテーションを追加し、いくつかの新しいサービスクラスを作成しました。
私のServletDispatcherコンテキストファイルには、次の定義が含まれています。
<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>
私のpom.xmlファイルには、ORMによると次の2つの依存関係しかありません。
<!-- 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>
多分問題はここにありますか?しかし、私は以前にパッケージが見つからなくても問題はありません。
これは私のコントローラーからのコードです:
UsersEntity user2 = new UsersEntity("qwerty", "qwerty", true);
usersService.addUser(user2);
No Session found for current thread
メソッドの呼び出し中に問題が発生しましたaddUser()
。
私のDAOクラス:
@Repository
public class UsersHome {
@Autowired
private SessionFactory sessionFactory;
public void persist(UsersEntity transientInstance) {
sessionFactory.getCurrentSession().persist(transientInstance);
}
}
私のサービス:
@Service
public class UsersService {
@Autowired
private UsersHome usersHome;
@Transactional(propagation = Propagation.REQUIRED)
public void addUser(UsersEntity user) {
usersHome.persist(user);
}
}
UsersHome
クラスのメソッド本体を変更すると、このコードは機能しなくなりました。以前は、アクションの前にセッションを開始し、アクションの後にセッションを終了していました。しかし、注釈とトランザクションを使用すると、機能するはずですか?いくつか提案をお願いします。
編集
<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>
編集#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
編集#3
私のroot-context.xml
ファイル:
<?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>
spring-config.xml
そして私のファイル全体:
<?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's 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>