web-dev-qa-db-ja.com

Spring Transactionsおよびhibernate.current_session_context_class

Hibernate 4とSpring Transactionsを使用するSpring 3.2アプリケーションがあります。すべてのメソッドがうまく機能し、データベースに正しくアクセスしてエンティティを保存または取得できました。次に、マルチスレッドを導入しました。各スレッドがdbにアクセスしていたため、Hibernateから次のエラーが発生していました。

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

<prop key="hibernate.current_session_context_class">thread</prop>をHibernate構成に追加する必要があることをWebから読みましたが、今ではdbにアクセスしようとするたびに次のようになります。

org.hibernate.HibernateException: saveOrUpdate is not valid without active transaction

ただし、私のサービスメソッドには@Transactionalの注釈が付けられており、<prop key="hibernate.current_session_context_class">thread</prop>を追加する前はすべて正常に機能していました。

メソッドに@Transactionalアノテーションが付いているのに、トランザクションがないのはなぜですか?この問題を解決するにはどうすればよいですか?

以下は私の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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

<!-- Hibernate session factory -->
<bean
    id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
    <property name="dataSource" >
        <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties" >
        <props>
            <prop key="hibernate.hbm2ddl.auto">create</prop> 
            <prop key="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>  
        </props>
    </property>   
    <property name="annotatedClasses" >
        <list>
            ...
        </list>
    </property> 
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

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

Springおよびspring管理トランザクションを使用する場合neverhibernate.current_session_context_classプロパティ[〜#〜] [〜#〜]がJTAを使用している場合を除きます。

Springはデフォルトで独自のCurrentSessionContext実装( SpringSessionContext )を設定しますが、自分で設定した場合はそうではありません。基本的に適切なトランザクション統合を壊します。

この設定を変更する唯一の理由は、JTA管理のトランザクションを使用する場合はいつでも、JTAと適切に統合するためにこれを設定する必要がある場合です。

34
M. Deinum