2016-03-28 15 views
3

私はHibernateで動作するSpringアプリケーションを持っています。以下のようにエラーをスローします:
[コンソールエラー] [1] :http://i.stack.imgur.com/Mb0Ah.png
Spring MVCとHibernate現在のスレッドのトランザクション同期セッションを取得できませんでした

従うとして
<?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" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> 


    <context:component-scan base-package="com.oi.controller" /> 



    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <!-- data source --> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     > 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:61391/springmvc2k" /> 
     <property name="username" value="adminHYMgZHE" /> 
     <property name="password" value="byIkcunaje5K" /> 
    </bean> 

    <!-- Hibernate SessionFactory --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.show_sql">true</prop> 

      </props> 
     </property> 
     <property name="packagesToScan" value="com.oi.bean"></property> 
    </bean> 
    <!-- The transaction manager --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
</beans> 

マイBeanクラス

import javax.persistence.Column; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 

import org.hibernate.annotations.Entity; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
@EnableTransactionManagement 
@Entity 
@Table(name="users") 
public class User { 
    @Id 
    @GeneratedValue 
    int id; 
    @Column(name = "username") 
    String name; 
    @Column(name = "password") 
    String password; 
    @Column(name = "email") 
    String email; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

マイスプリングコントローラ以下のようなマイディスパッチャコード

import java.util.List; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 

import com.oi.bean.User; 

@Controller 
public class BaseController { 
    @Autowired 
    private SessionFactory sessionFactory; 

    @RequestMapping(value="/") 
    public String getRespnse(Model m) { 
     Session session =sessionFactory.getCurrentSession(); 
    // List<User> usrLst=(List<User>) session.createQuery("from User"); 
    // System.out.println("IN"+usrLst); 
     return "home"; 
    } 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

} 

お願いします。

答えて

4
@RequestMapping(value="/") 
    @Transactional 
    public String getRespnse(Model m) { 
     Session session =sessionFactory.getCurrentSession(); 
    // List<User> usrLst=(List<User>) session.createQuery("from User"); 
    // System.out.println("IN"+usrLst); 
     return "home"; 
    } 
  1. お使いのコントローラメソッドを@Transactionalを追加
  2. ユーザークラスに@EnableTransactionManagementを削除

それを試してみて、私はそれはあなたが

+0

ありがとう。出来た。それはとても素晴らしいことです。この2つの動いた声明についてあなたは説明することができます。それは将来私の役に立つことでしょう –

+0

あなたの歓迎:) –

1

BaseControllerクラスのgetRespnse(Model m)@Transactional属性を追加し、次のように入力してください。

@RequestMapping(value="/") 
@Transactional 
public String getRespnse(Model m) { 
    Session session =sessionFactory.getCurrentSession(); 
+0

@RajasekarRamalingam 'のために働くだろうと思いますTransactionalアノテーションを使用すると、宣言的トランザクション管理機能を使用したいSpringを示すことができます。トランザクションを作成したり、コミットしたり、ロールバックしたりすることを心配する必要はありません。そしてHibernateは、新しいセッションを作成している間、アクティブなトランザクションを探します。そして 'User'クラスから' EnableTransactionManagement'を削除することについて - Springの設定ファイルには既にこのアノテーションに相当する ''があります。それを2回定義する必要はありません。確かに、AFAIK、あなたの情報のために –

+0

ありがとうが、テストされていない問題を引き起こすことを2回定義するでしょう:) –

関連する問題