gpt4 book ai didi

Spring事务和hibernate.current_session_context_class

转载 作者:IT老高 更新时间:2023-10-28 13:49:12 27 4
gpt4 key购买 nike

我有一个使用 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 配置,但现在每次我尝试访问我得到的数据库时:

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

但是我的服务方法用 @Transactional 注释,并且在添加 <prop key="hibernate.current_session_context_class">thread</prop> 之前一切正常.

为什么方法用@Transactional注解却没有事务?我该如何解决这个问题?

这是我的 Hibernate 配置(包括 session 上下文属性):

<?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"/>

最佳答案

当使用 spring 和 spring 托管事务时永远不要弄乱 hibernate.current_session_context_class 属性 UNLESS 您正在使用 JTA。

Spring 将默认设置自己的 CurrentSessionContext 实现(SpringSessionContext),但是如果您自己设置,则情况并非如此。基本上破坏了正确的事务集成。

更改此设置的唯一原因是当您想使用 JTA 托管事务时,您必须设置此设置以与 JTA 正确集成。

关于Spring事务和hibernate.current_session_context_class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18832889/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com