2013-12-21 15 views
6

私はspringとhibernateを使ってjava stuts2 Webアプリケーションを持っています。Spring-Hibernate - 現在のスレッドでセッションが見つかりません

イム取得org.hibernate.HibernateException: No Session found for current thread

SpringBean.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="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 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <context:component-scan base-package="org.rohith" /> 
    <context:annotation-config /> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/company" /> 
     <property name="username" value="root" /> 
     <property name="password" value="password" /> 
    </bean> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 

     <property name="dataSource"> 
      <ref bean="dataSource" /> 
     </property> 

     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
      </props> 
     </property> 

     <property name="mappingResources"> 
      <list> 
       <value>hibernate.cfg.xml</value> 
      </list> 
     </property> 

    </bean> 
    <!-- <tx:annotation-driven/> --> 
    <bean id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name = "sessionFactory" ref = "sessionFactory" /> 
    </bean> 

    <bean id="customerDaoImpl" class="org.rohith.dao.impl.CustomerDaoImpl"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <bean id="customerServiceImpl" class="org.rohith.service.impl.CustomerServiceImpl"> 
     <property name="customerDaoImpl" ref="customerDaoImpl"/> 
    </bean> 

</beans> 

hibernate.cfg.xmlの

<?xml version='1.0' encoding='utf-8'?> 
    <!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <!-- Names the annotated entity class --> 
     <mapping class="org.rohith.model.Customer"/>  
    </session-factory> 
</hibernate-configuration> 

CustomerServiceImpl.java

package org.rohith.service.impl; 

import org.rohith.dao.impl.CustomerDaoImpl; 
import org.rohith.model.Customer; 
import org.rohith.service.CustomerService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

@Service 
public class CustomerServiceImpl implements CustomerService { 

    @Autowired 
    private CustomerDaoImpl customerDaoImpl; 

    @Override 
    public void saveCustomer(Customer customer) { 
     customerDaoImpl.saveCustomer(customer); 
    } 
    public CustomerDaoImpl getCustomerDaoImpl() { 
     return customerDaoImpl; 
    } 
    public void setCustomerDaoImpl(CustomerDaoImpl customerDaoImpl) { 
     this.customerDaoImpl = customerDaoImpl; 
    } 

} 

CustomerDaoImpl.java

package org.rohith.dao.impl; 

import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.rohith.dao.CustomerDao; 
import org.rohith.model.Customer; 


public class CustomerDaoImpl implements CustomerDao { 

    private SessionFactory sessionFactory; 

    @Override 
    public void saveCustomer(Customer customer) { 
     Session session = getSession(); 
     session.clear(); 
     try { 
       session.saveOrUpdate(customer); 
       session.flush(); 
     } catch (Throwable e) { 
      throw new RuntimeException(e.getMessage(), e); 
     } 
    } 
    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 
    public SessionFactory getSessionFactory() { 
     return this.sessionFactory; 
    } 

    public Session getSession() throws HibernateException { 
     Session sess = getSessionFactory().getCurrentSession(); 
     if (sess == null) { 
      sess = getSessionFactory().openSession(); 
     } 
//  Session sess = getSessionFactory().openSession(); 
     return sess; 
    } 

} 

CustomerAction.java

public class CustomerAction extends ActionSupport{ 
    private String name; 
    private String addr1; 
    private String addr2; 
    private String city; 
    private String state; 

    private CustomerServiceImpl customerServiceImpl; 

//Getters and setters 

    public String execute(){ 
     Customer cust= new Customer(); 
     cust.setName(name); 
     cust.setAddress1(addr1); 
     cust.setAddress2(addr2); 
     cust.setCity(city); 
     cust.setState(state); 
     System.out.println(name); 
     WebApplicationContext webApplicationContext = WebApplicationContextUtils 
       .getRequiredWebApplicationContext(getRequest().getSession() 
         .getServletContext()); 
     customerServiceImpl = (CustomerServiceImpl) webApplicationContext.getBean("customerServiceImpl"); 
     customerServiceImpl.saveCustomer(cust); 
     //saveCust(cust); 
     return "success"; 
    } 
protected HttpServletRequest getRequest() { 
     return ServletActionContext.getRequest(); 
    } 
protected HttpServletResponse getResponse() { 
     return ServletActionContext.getResponse(); 
    } 
} 

例外私は

org.hibernate.HibernateException: No Session found for current thread 
    org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 
    org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:978) 
    org.rohith.dao.impl.CustomerDaoImpl.getSession(CustomerDaoImpl.java:33) 
    org.rohith.dao.impl.CustomerDaoImpl.saveCustomer(CustomerDaoImpl.java:16) 
    org.rohith.service.impl.CustomerServiceImpl.saveCustomer(CustomerServiceImpl.java:18) 
    org.rohith.CustomerAction.execute(CustomerAction.java:36) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:606) 
+1

を助けるかもしれません。ファイル内の ''のコメントを外し、@Transactionalでサービスに注釈を付けます。また、XMLですべてのBeanとプロパティを定義すると、なぜ@Autowiredアノテーションを使用していますか?なぜあなたはサービスやDAOのインターフェースを決して使用しないのですか? –

答えて

19

あなたはSpringの設定でトランザクションマネージャを指定していますが、トランザクションを適用するタイミングや場所は設定していません。あなたのSpringBean.xml

あなたは<tx:annotation-driven/>のコメントを外す必要があります。

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

そして、あなたは@TransactionalとしてCustomerServiceImpl.saveCustomer方法に注釈を付ける必要があります。

@Service 
public class CustomerServiceImpl implements CustomerService { 

    ... 

    @Override 
    @Transactional 
    public void saveCustomer(Customer customer) { 
     customerDaoImpl.saveCustomer(customer); 
    } 

    ... 
} 
+0

thanks.my問題を解決しました –

+0

+1 hte true ans – Krishna

8

が休止状態4.

のためにあなたの hibernate.cfg.xmlファイルに次のプロパティを追加取得しています
<property name="hibernate.current_session_context_class">thread</property> 
+0

私はまだ1つの質問を持っています – Krishna

2

あなたのJava構成ファイルで@EnableTransactionManagement注釈を追加します。 xmlを使用しないアノテーションに基づく設定の場合

これは、あなたのコード内で取り扱うすべてのトランザクションを持っていない誰か

1
You can add in hibernate.proerties below value. It's worked for me. 

hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext 

または

hibernate.current_session_context_class =スレッド