私は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?
はい私はSpringを2.5から3.2.4にアップグレードしました。私はあなたの答えsufficineltyが春までにセッションを処理する際の行動上の違いを説明していると思います。そして、HibernateよりSpringにもっと関連していますか?(あるいはその両方?) –
しかし、コンテキストセッションとその理由について詳しく説明できますか?休止状態でのセッション処理全体を説明するhibernateドキュメント以外の有用なリンクがある場合、Springがこれらの処理のやり方をどこでどのように行うのか、私は非常に義務づけられます。もちろん、私はコードをデバッグすることができます。しかし、今すぐコードを掘り下げる前に、まず理論的にもっと明確にする必要があります。 –
@ShaileshVaishampayan Spring 2.5と3.2の違いは、最小限の休止状態で説明できます(3.2は、よりクリーンな統合)。 http://stackoverflow.com/questions/7871386/what-is-contextual-sessions-in-hibernateには、コンテキストセッションに関する情報がいくつかあります。しかし、コンテキストセッションの直前に、現在のセッション自体を追跡する必要がありました(インスタンス変数にセッションを格納する必要があります)。今、これは休止状態に委任され、休止状態のようなフレームワークにとってはより簡単になります。 –