java - 定义在将 Spring 事务管理与 hibernate 一起使用时不在事务中运行的方法

标签 java spring hibernate spring-mvc

我目前正在编写一个 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!
        ...

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

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

有什么想法吗?

最佳答案

需要进行交易,可以将此方法标记为只读

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

来自spring documentation :

Read-only status: a read-only transaction does not modify any data. Read-only transactions can be a useful optimization in some cases (such as when using Hibernate).

来自JBoss Wiki

Many application developers think they can talk to a database outside of a transaction. This obviously isn’t possible; no SQL statement can be send to a database outside of a database transaction. The term nontransactional data access means there are no explicit transaction boundaries, no system transaction, and that the behavior of data access is that of the autocommit mode. It doesn’t mean no physical database transactions are involved.

更多:

关于java - 定义在将 Spring 事务管理与 hibernate 一起使用时不在事务中运行的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19978791/

相关文章:

java - Apache POI 删除行并追加行

java - 执行 Apache Ant 制作的可执行 jar 导致的错误

java - 自定义 DiscoveryClient 用于发现 Spring Cloud Config 服务器

xml - hibernate 映射错误?

java - 在单个 Spring 应用程序中增加数据库模式

Java - 从字符串中解析枚举的通用函数

java - 部署 Java EE 应用程序后执行任务

java - Spring Boot - 如何在一个地方记录所有带有异常的请求和响应?

spring - 未能延迟初始化集合

java - Spring Data 和 JPA 中的递归关系?