当前位置: 首页 > 面试题库 >

Spring交易和hibernate.current_session_context_class

姬坚成
2023-03-14
问题内容

我有一个使用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配置(包括会话上下文属性):

<?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管理的事务时, 除非* 您正在使用JTA, 否则 切勿
乱用hibernate.current_session_context_class属性。
*

默认情况下,Spring将设置自己的CurrentSessionContext实现(SpringSessionContext),但是如果您自行设置,则情况并非如此。基本上破坏了适当的交易集成。

更改此设置的唯一原因是,每当您要使用JTA管理的事务时,都必须进行设置以与JTA正确集成。



 类似资料:
  • 问题内容: 您能否解释以下两种交易类型之间的区别: Hibernate交易 Spring交易 我也想了解注释。 问题答案: 对于初学者来说,它们都是事务,但是它们包含不同的概念和组件。 TL; DR Hibernate处理数据库特定的事务,而spring提供常规的事务管理服务。是配置事务管理行为的好方法。 长话说: 交易次数 事务基本上是工作的单元(即,对某事物的更改),可以作为可提交或回滚的单个

  • 我正在学习使用JPA。我有点困惑。 根据JPA,EntityManager管理事务。但是一种设计模式是将EntityManager注入DAO中。那么不同的实体管理器怎么可能是同一个事务呢? 这是我要解决的案子 我定义了 DAO . 我有一个服务。 然后从@Controller,我将调用main Method()。在同一个服务中并使用同一个存储库中,对transactionalMED1、transa

  • 我使用Spring boot作为rest后端系统和Spring数据,我有三个主要层(控制器、服务、dao)。 我用@Transactional注释了服务类,并且在它的一个方法中,我正在检索一些与其他实体具有@ManyTo很多关系的实体。 我只想得到主实体,我依赖于@ManyToMany的懒惰。 问题是在从服务返回到控制器之后,当我点击(多)端时,会发出一条sql语句并检索集合,就好像事务仍在运行一

  • 问题内容: 我有一个具有事务性属性的方法: 可以同时多次调用此方法,并且对于每个事务,如果发生错误而不是将其回滚(独立于其他事务),则将被多次调用。 问题在于,这可能迫使Spring创建多个事务,即使另一个事务可用,也可能会导致一些性能问题。 Java doc 说: 这似乎解决了性能问题,不是吗? 回滚问题呢?如果在使用现有事务时新方法调用回滚怎么办?那会不会回滚整个交易,即使以前的呼叫也是如此?

  • 问题内容: 假设我为JOOQ提供了一个自定义,它恰好使用自动提交设置为false的连接池。 实现大致是: 如何将两个jooq查询包装到一个事务中? 使用DefaultConnectionProvider很容易,因为只有一个连接-但是对于池,我不确定该怎么做。 问题答案: jOOQ 3.4交易API 使用jOOQ 3.4,已添加事务API以通过JDBC,Spring或JTA事务管理器进行抽象。该AP

  • 问题内容: 我试图使声明式交易工作。 这是我的spring.xml文件: 这是我的控制器实现: 两者都在称为test的包中。 这是我的尝试: 但这引发了异常: org.hibernate.HibernateException:如果没有活动事务,createQuery无效 为什么transactionManager不起作用?我希望使用@Transactional批注将所有事务由Spring框架管理。