0

我目前正在编写一个 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”可以解决问题,但是对于这种方法,不需要事务...

有任何想法吗?

4

2 回答 2

2

需要交易,可以将此方法标记为read-only

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

弹簧文档

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

来自JBoss 维基

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

更多的:

于 2013-11-14T13:26:51.853 回答
0
<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类。

于 2013-11-14T13:30:26.717 回答