web-dev-qa-db-ja.com

Spring Hibernate - 現在のスレッドに対してトランザクション同期セッションを取得できませんでした

Spring + hibernateでアプリケーションを作成しましたが、いつもこのエラーが出ます。これは休止状態で私の最初のアプリケーションです、私はいくつかのガイドを読みますが、私はこの問題を解決することはできません。どこが悪いの?

これは私のアプリケーションのコードです

ott 05, 2014 4:03:06 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
Informazioni: Refreshing   org.springframework.context.support.ClassPathXmlApplicationContext@1eab16b: startup date  [Sun Oct 05 16:03:06 CEST 2014]; root of context hierarchy
ott 05, 2014 4:03:06 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
Informazioni: Loading XML bean definitions from class path resource [springConfig.xml]
ott 05, 2014 4:03:08 PM org.hibernate.annotations.common.reflection.Java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
ott 05, 2014 4:03:08 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.6.Final}
ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
ott 05, 2014 4:03:09 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
ott 05, 2014 4:03:09 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
ott 05, 2014 4:03:09 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Exception in thread "main" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.Java:134)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.Java:1014)
at coreservlets.StudentDAOImpl.create(StudentDAOImpl.Java:19)
at coreservlets.MainApp.main(MainApp.Java:14)

学生。ジャワ

package coreservlets;

public class Student {

    private Integer id;
    private String name;
    private Integer age;

    public Integer getId(){return id;}//getId

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

    public String getName(){return name;}//getName

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

    public Integer getAge(){return age;}//getAge

    public void setAge(Integer age){this.age=age;}//setAge

}//Student

studentDAO.Java

package coreservlets;

import org.hibernate.SessionFactory;

public interface StudentDAO {

    public void setSessionFactory(SessionFactory sessionFactory);

    public void create(String name,Integer age);

}//StudentDAO

StudentDAOImpl.Java

package coreservlets;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class StudentDAOImpl implements StudentDAO {

    private SessionFactory sessionFactory;

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

    public void create(String name,Integer age){
        Session session=sessionFactory.getCurrentSession();
        Student student=new Student();
        student.setName(name);
        student.setAge(age);
        session.save(student);
    }//create

}//StudentDAOImpl

MainApp.Java

package coreservlets;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

    public static void main(String[] args) {

        ApplicationContext context=new ClassPathXmlApplicationContext("springConfig.xml");

        StudentDAOImpl student=(StudentDAOImpl) context.getBean("studentDAOImpl");

        student.create("Alessandro", new Integer(33));


    }//main

}//MainApp

springConfig.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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

<context:annotation-config/>

<context:component-scan base-package="coreservlets"/>

<bean id="dataSource" class="org.Apache.commons.dbcp2.BasicDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/spring_hibernate"/>
  <property name="username" value="root"/>
  <property name="password" value="password"/>
  <property name="initialSize" value="5"/>
  <property name="maxTotal" value="10"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
    <value>
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
    </value>
</property>

</bean>

</beans>

sQL

create table student
(
id integer not null auto_increment,
name varchar(20) not null,
age integer not null,
primary key(id)
);
87
Alex

トランザクションサポート(<tx:annotation-driven>または@EnableTransactionManagement)および宣言transactionManager有効にするにする必要があります。これはSessionFactoryを介して機能するはずです。

@Transactional@Repositoryを追加する必要があります

@Transactional@Repositoryを入れることでSpringはあなたのリポジトリにトランザクションサポートを適用することができます。

あなたのStudentクラスには@ javax.persistence。*アノテーションがありません。どのように@Entity、私はそのクラスのマッピング設定がXMLを通して定義されていると思います。

175
Manuel Jordan

私は同じ問題を抱えていますが、それはサービス層の一部ではなかったクラスです。私の場合、トランザクションマネージャは単にgetBean()メソッドによってコンテキストから取得され、そのクラスはビューレイヤに属していました - 私のプロジェクトはOpenSessionInViewテクニックを利用しています。

sessionFactory.getCurrentSession()メソッドは、作者のものと同じ例外を引き起こしています。私にとっての解決策はかなり単純でした。

Session session;

try {
    session = sessionFactory.getCurrentSession();
} catch (HibernateException e) {
    session = sessionFactory.openSession();
}

getCurrentSession()メソッドが失敗した場合、openSession()がうまくいくはずです。

34
itachi

クラスサービスにspringのアノテーション@Transactionalを追加します。

12
Patrikoko

あなたのxyz.DAOImpl.Javaに

以下の手順を実行してください。

// Step-1:セッションファクトリを設定する

@Resource(name="sessionFactory")
private SessionFactory sessionFactory;

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

// Step-2:現在のセッションを取得し、HibernateException例外をキャッチします。


// Step-3:HibernateException例外がある場合は、trueにしてopenSessionを取得します。

try 
{
    //Step-2: Implementation
    session = sessionFactory.getCurrentSession();
} 
catch (HibernateException e) 
{
    //Step-3: Implementation
    session = sessionFactory.openSession();
}
2
ArunDhwaj IIITH

@Transactional = javax.transaction.Transactionalは@リポジトリの横に配置します。

1
Alter Hu

私はweb.xmlにこれらの設定を追加しました、そしてそれは私のためにうまく働きます!

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
    <init-param>
        <param-name>flushMode</param-name>
        <param-value>AUTO</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

さらに、最もランクの高い回答は、最初の実行時にアプリケーションがパニックにならないようにするための手がかりを与えてくれます。

1
何德福

あなたはあなたのDAOメソッドへのトランザクションを許可する必要があります。追加、

@ Transactional(readOnly = true、伝播= Propagation.NOT_SUPPORTED)

あなたのDAOメソッドを超えて。そして@Transactionalはパッケージであるべきです、

org.springframework.transaction.annotation.Transactional

1
RahuL Sharma

@Transactionalアノテーションを使用したファイルで、間違ったクラスをインポートしていたため、このエラーも発生しました

import javax.transaction.Transactional; 

Javaxの代わりに、

import org.springframework.transaction.annotation.Transactional; 
1
browndoor

私の設定はこんな感じでした。私はQuartzJob、Service Bean、そしてDaoを持っていました。通常通り、LocalSessionFactoryBean(休止状態用)、およびQuartzフレームワーク用のSchedulerFactoryBeanで設定されていました。 Quartzの仕事を書いている間に、私は間違って@Serviceのアノテーションを付けましたが、QuartzBeanを配線するために別の方法を使っていたのでそうしてはいけません)AutowiringSpringBeanJobFactoryを拡張してSpringBeanJobFactoryを使用します。

そのため、実際に起こっていたのは、Quartz Autowireのおかげで、TXがJob Beanにインジェクトされ、同時にT(x)コンテキストが@Serviceアノテーションによって設定されたため同期していない!

私はそれが上記の解決策が本当に問題を解決しなかった人たちのために役立つことを願っています。私はSpring 4.2.5とHibernate 4.0.1を使っていました、

このスレッドでは、DAO(@Repository)に@Transactionalアノテーションを追加するという不要な提案があることがわかりました。 DAOはサービスから呼び出されるため、@リポジトリには、@トランザクション対応を特別に設定する必要はありません。 @ Trasancationalによって既に注入されています。これが、Quartz、Spring、およびHibernateを一緒に使用している人に役立つことを願っています。

0
SANJAY GAUTAM

私は同じ問題に遭遇し、最後にそれが[dispatcher] -servlet.xml内で定義されていないことを発見しました。ここでcomponent-scan要素は@serviceアノテーション付きクラスを有効にしました。

単にcomponent-scan要素を組み合わせるだけで、問題は解決しました。

0
Lee

spring-servlet.xml:transaction-manager<annotation-driven/>を追加してください

<tx:annotation-driven transaction-manager="yourTransactionBeanID"/>
0
Majid

私の解決策は、(Springを使用して)トランザクションを作成してコミットする別のメソッド内に失敗したメソッドを入れることでした。

それをするために、私は最初に以下を注入しました:

@Autowired
private PlatformTransactionManager transactionManager;

そして最後にこれをやった:

public void newMethod() {
    DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
    TransactionStatus transaction = transactionManager.getTransaction(definition);

    oldMethod();

    transactionManager.commit(transaction);
}
0
Aliuk

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

  1. トランザクションを手動で処理することによって。

    セッションsession = sessionFactory.getCurrentSession();

    トランザクションtx = session.beginTransaction();

    UserInfo user =(UserInfo)session.get(UserInfo.class、1);

    tx.commit();

  2. Web.xmlフィルタであなたに代わってトランザクションを開いて管理するようにSpringに指示し、@ Repository @Transactionalを必ず使用してください。

    <フィルタ> <フィルタ名> hibernateFilter </フィルタ名> <フィルタクラス> org.springframework.orm.hibernate5.support.OpenSessionInViewFilter </フィルタクラス> <init-param> <パラメータ名> sessionFactory <パラメータ-value> session.factory </ init-param> </ filter> <フィルタマッピング> <フィルタ名> hibernateFilter </フィルタ名> <url-pattern>/* </ url-pattern> </ filter-マッピング>

不適切なフォーマットでごめんね。

0

あなたのdaoクラスをチェックしてください。これは次のようになります。

Session session = getCurrentSession();
Query query = session.createQuery(GET_ALL);

そして注釈:

@Transactional
@Repository
0