2017-05-16 5 views
0

私はSpring 4.3.8とHibernate 5.2.10を使用していますが、データベースにテーブルを作成しようとしていますが、メートル取得エラーorg.hibernate.HibernateException:現在のスレッドのトランザクション同期セッションを取得できませんでした

ダオクラス

@Transactional 
    public void saveDayBookData(DayBookData dayBook){ 
     hibernateTemplate.getSessionFactory().getCurrentSession().setFlushMode(FlushMode.AUTO); 
     hibernateTemplate.saveOrUpdate(dayBook); 
    } 
すべての春に

と休止状態の設定

applicationContext.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" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> 


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
     <property name="url" value="jdbc:mysql://localhost:3306/db1?autoReconnect=true&amp;useSSL=false"></property> 
     <property name="username" value="root"></property> 
     <property name="password" value="root"></property> 
    </bean> 

    <bean id="mysessionFactory" 
     class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
     <property name="packagesToScan" value="entityClasses"></property> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="template" class="org.springframework.orm.hibernate5.HibernateTemplate"> 
     <property name="sessionFactory" ref="mysessionFactory"></property> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="mysessionFactory"></property> 
    </bean> 

    <bean id="vendor" class="vendors.VendorDao"> 
     <property name="hibernateTemplate" ref="template"></property> 
    </bean> 

    <bean id="dayBook" class="accountBooks.DayBookDao"> 
     <property name="hibernateTemplate" ref="template"></property> 
    </bean> 

</beans> 

メインクラス

public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Resource r = new ClassPathResource("applicationContext.xml"); 
     BeanFactory bean = new XmlBeanFactory(r); 

     DayBookDao dayBookDao = (DayBookDao) bean.getBean("dayBook"); 
     DayBookData dayBook = new DayBookData(); 
     dayBook.setAccountType("Bank Account"); 
     dayBook.setTransType("Receipt"); 
     dayBook.setOppAccount("Profit-Loss"); 
     dayBook.setAmount(15000); 
     dayBook.setTransDate(new Date()); 
     dayBookDao.saveDayBookData(dayBook); 
    } 

は私が

Exception in thread "main" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    at org.springframework.orm.hibernate5.SpringSessionContext.currentSession(SpringSessionContext.java:133) 
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:456) 
    at accountBooks.DayBookDao.saveDayBookData(DayBookDao.java:22) 
    at accountBooks.TestDayBook.main(TestDayBook.java:28) 

答えて

0

が問題のように見えるこのエラーを取得していすると、DAOを作成する方法です。

代わりにあなたのapplicationContext.xml

<context:component-scan base-package="com.your.package.here" /> 

にスキャンを追加春が彼らのためにプロキシを作成できるように@RepositoryとDAOクラスに注釈を付けます。

xmlから宣言するDAO Beanを削除します。

0

私の同様の問題は、以下の2つのアプローチで修正されました。

  1. トランザクションを手動で処理します。

    セッションセッション= sessionFactory.getCurrentSession(); トランザクションtx = session.beginTransaction(); UserInfo user =(UserInfo)session.get(UserInfo.class、1); tx.commit();

  2. 開き、管理するトランザクションをあなたのためにweb.xmlのフィルタにと@Repository @Transactional

    <フィルタ> <フィルタ名> hibernateFilter < /フィルタ名> <を使用することを確認するために春を知らせますフィルタクラス> org.springframework.orm.hibernate5.support.OpenSessionInViewFilter < /フィルタクラス> <のinit-param>の <のparam-name>のSessionFactoryの <のparam-value>のsession.factory </initの-param>の < /フィルタ> <のfilter-mapping> <フィルタ名> hibernateFilter < /フィルタ名> <のurl-pattern>/* < /のurl-pattern> < /フィルター - マッピング>

申し訳ありませんが不適切な書式設定。

関連する問題