2013-11-09 7 views
6

私はSpringとHibernate3が稼働しているアプリケーションを持っています。それは生産に正常に動作しているcurrent_session_context_classプロパティを使用しています。hibernate 3 hibernate 4

 <bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mappingDirectoryLocations"> 
     <list> 
      <value>classpath:/hibernate</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect 
      </prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.use_sql_comments">true</prop> 
      <prop key="hibernate.max_fetch_depth">2</prop> 
      <prop key="hibernate.autocommit">false</prop> 
      <prop key="hibernate.current_session_context_class ">thread</prop> 
          <prop key="hibernate.generate_statistics">true</prop> 
      <prop key="hibernate.jdbc.batch_size">20</prop> 
     </props> 
    </property> 
</bean> 

<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean 
    below) --> 
<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <!-- the transactional semantics... --> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
     <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> 
     <tx:method name="count*" propagation="SUPPORTS" read-only="true" /> 
     <tx:method name="validate*" propagation="SUPPORTS" 
      read-only="true" /> 
     <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> 
     <tx:method name="login" propagation="SUPPORTS" read-only="true" /> 
    </tx:attributes> 
</tx:advice> 

<!-- ensure that the above transactional advice runs for any execution of 
    an operation defined by the service interfaces --> 
<aop:config> 
    <aop:pointcut id="projectServiceOperation" 
     expression="execution(* com.service.project.IProjectService.*(..))" /> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="projectServiceOperation" /> 
</aop:config> 

SpringのapplicationContext.xmlをでセッションファクトリのための設定は、次のとおり。

別のプロジェクトでは、Hibernate4に移行します。 Hiernate 4のSessionFactoryやTransacionManagerなどを使用して、 org.springframework.orm.hibernate4。*パッケージから同じ設定をコピーしました。 しかし、「保存はアクティブなトランザクションなしでは有効ではありません」という例外を出し始めました。 ビットを検索した後、多くの人が問題に直面しているように見えたし、いくつかの人々が

 <prop key="hibernate.current_session_context_class ">thread</prop> 

プロパティを使用しないように提案し、それが働きました。それはまた私のために働いた。私がポストから集めることができたすべての情報は、Springのセッション管理戦略を妨害するコンテキスト・セッションやスレッド戦略と関係があります。しかし、私はどこで具体的な答えを見つけることができませんでした。 また、なぜHibernate3では動作し、Hibernate4では動作しませんでしたか?違いと何が変わったのですか?その他の設定はすべて同じです。私は@Transactionalではなく古い学校のXML方法を使っています。

Can somebody point me to clear explaination for this behavioural difference in Hibernate3 and Hibernate4? 

答えて

6

それは(あなたが取引のためにJTAを使用しない限り、あなたはこれを設定する必要があります)、スプリングのバージョンによって異なりますが春を使用しながら、そのプロパティをいじり、一般的に避けなければなりません。

Hibernate 3.1では、コンテキストセッションと呼ばれるものがあり、そのために休止状態はCurrentSessionContextインターフェイスを提供します。これにはいくつかの実装があります(はThreadLocalSessionContextの略です)。 Springは、このインタフェースの独自の実装であるSpringSessionContextクラスを持っています。

デフォルトでは、SpringはCurrentSessionContextのSprings実装に設定します。これが他のもの(JTA以外)に設定されている場合、これは休止状態のセッション(したがってトランザクション)を管理するスプリング機能を解除します。

これまでのバージョンのSpringでは、Springをアップグレードして、Hibernateを使用できると仮定しています)、Hibernate 3と組み合わせると、セッションを取得する際に別のトリッキーが発生しました(旧バージョン3.xとの下位互換性休止状態の)。これにより、Springはそのプロパティの値に依存しなくなりました。 (春はSessionFactoryのプロキシを作成し、基本的にはセッションを管理できる方法であるgetSessionを傍受しました)。

+0

はい私はSpringを2.5から3.2.4にアップグレードしました。私はあなたの答えsufficineltyが春までにセッションを処理する際の行動上の違いを説明していると思います。そして、HibernateよりSpringにもっと関連していますか?(あるいはその両方?) –

+0

しかし、コンテキストセッションとその理由について詳しく説明できますか?休止状態でのセッション処理全体を説明するhibernateドキュメント以外の有用なリンクがある場合、Springがこれらの処理のやり方をどこでどのように行うのか、私は非常に義務づけられます。もちろん、私はコードをデバッグすることができます。しかし、今すぐコードを掘り下げる前に、まず理論的にもっと明確にする必要があります。 –

+0

@ShaileshVaishampayan Spring 2.5と3.2の違いは、最小限の休止状態で説明できます(3.2は、よりクリーンな統合)。 http://stackoverflow.com/questions/7871386/what-is-contextual-sessions-in-hibernateには、コンテキストセッションに関する情報がいくつかあります。しかし、コンテキストセッションの直前に、現在のセッション自体を追跡する必要がありました(インスタンス変数にセッションを格納する必要があります)。今、これは休止状態に委任され、休止状態のようなフレームワークにとってはより簡単になります。 –

関連する問題