当前位置: 首页 > 知识库问答 >
问题:

定义在使用Springs事务管理和hibernate时不在事务中运行的方法

终子昂
2023-03-14

我目前正在编写一个spring-webmvc应用程序,几天前,我的第一个问题是我不知道如何使用Hibernate和Spring进行交易。现在一切正常,一个事务管理器上线了,我可以成功地处理事务。

这是我基于Java的Spring配置的一部分:

@Configuration
@ComponentScan(basePackages = { "de.macomp.maipds" })
@EnableTransactionManagement
public class MainConfigLib {

    ...

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager manager = new HibernateTransactionManager(sessionFactory());
        return manager;
    }
}

因此,当我想让我的服务层或dao层中的方法在事务中运行时,我只需用@Transactional对其进行注释,一切正常。我的问题是,当我不想让服务方法在事务内运行时,会出现以下错误:

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

发生这种情况的代码如下所示:

    ...
    @Override
    public Publisher findByName(String name) {
        Session session = this.sessionFactory.getCurrentSession();
        //bam!
        ...

我能以某种方式“强制”我的环境给我一个“非事务性”会话吗?!我的DAO中sessionFactory的transactionManager属性为空。

将@Transactional添加到“findByName”可以解决问题,但对于此方法,不需要任何事务...

有什么想法吗?

共有2个答案

公良信然
2023-03-14
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name="sessionFactory">
       <ref bean="mySessionFactory"/>
   </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

添加上述定义,并用@Transactional注释标记服务或dao类。

孟成化
2023-03-14

需要事务,可以将此方法标记为只读

@Transactional(readOnly = true)
public Publisher findByName(String name) {
   ...
}

从Spring留档:

只读状态:只读事务不会修改任何数据。在某些情况下(例如使用Hibernate时),只读事务可能是一种有用的优化。

来自JBoss Wiki

许多应用程序开发人员认为他们可以在事务之外与数据库对话。这显然是不可能的;在数据库事务之外,不能向数据库发送任何SQL语句。术语非事务性数据访问意味着没有明确的事务边界,没有系统事务,并且数据访问的行为是自动提交模式的行为。这并不意味着不涉及物理数据库事务。

更多:

  • 为什么我需要Hibernate中的Transaction进行只读操作
  • 不鼓励使用隐式事务
 类似资料:
  • 我在一家spring boot hibernate JPA个人项目书店工作。我面临一个问题,即使用@Transactional注释注释的方法即使在运行时异常的情况下也无法回滚事务。我使用的是spring boot版本1.5.1、hibernate版本5、java版本11 下面是bean配置文件代码: 下面是BooK模型文件代码 下面是商店型号代码 下面是BookDaoImpl代码 下面是Store

  • 在db会话监视器中,当这种情况发生时,我得到了一个不活动的事务。 我得到的错误如下: 问题是交易和连接应该自动打开和关闭...我希望并发修改失败的事务得到回滚...但似乎他们变得不活跃了。

  • 问题内容: 我正在编写一个使用GWT,Hibernate和Google Guice(带有GIN)的相当简单的应用程序。我想做的是使用外部管理器(例如在Spring中使用)来管理事务 ,而不是使用。我尝试使用,但似乎不适用于我。 我已经使用注入了EntityManager ,如下所示: 手动管理事务时,它似乎可以正常工作。我希望自动管理事务,也希望使用DBUnit进行自动化测试。 有人知道如何解决吗

  • 问题内容: 我刚刚开始使用spring和hibernate进行项目。我的DAO图层类扩展了HibernateDaoSupport。我们没有使用注释。之前,我们使用了struts,因此我们使用了Session类提供的getTransaction,commit,rollback ..方法。我的要求非常简单,对于所有DAO类,如果有异常,则回滚,否则提交。请提出介绍spring交易管理的最简单方法。 问

  • 我们使用JPA(Hibernate4)和Spring4管理JTA事务。由于应用程序的某些部分也使用JDBC来访问数据库,因此我们需要确保JDBC和JPA加入同一个事务,以查看提交之前另一个事务发生了什么变化。 您可以在GitHub https://GitHub.com/abenneke/sandbox/tree/master/spring-hibernate4-transaction上找到这些问题

  • 我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码: 也有and,但是当事务在第二次调用时失败时,第一个被提交。