我有一个 Spring 和 Hibernate3 在生产中运行良好的应用程序。以下是 Spring 的 applicationContext.xml 中会话工厂的配置
<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>
它在生产中运行良好。
现在对于另一个项目,我们正在迁移到 Hibernate4。我们复制了相同的配置,除了使用来自 org.springframework.orm.hibernate4.* 包的 Hibernate 4 的 SessionFactory、TransacionManager 等。但是它开始给出异常说“如果没有活动的交易,保存是无效的”。搜索了一下,好像很多人都遇到了问题,有几个人建议不要使用
<prop key="hibernate.current_session_context_class ">thread</prop>
财产,它的工作。它也对我有用。我可以从帖子中收集到的所有信息都与上下文会话和干扰 Spring 会话管理策略的线程策略有关。但是我找不到任何具体的答案。
另外,为什么它适用于 Hibernate3 而不是 Hibernate4。有什么区别和改变了什么?其他所有配置都相同。我没有使用@Transactional,而是使用老式的 XML 方式。
有人可以指出我对 Hibernate3 和 Hibernate4 之间的这种行为差异的明确解释吗?