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

时间:2013-11-14 13:22:20

标签: 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!
        ...

我可以“强迫”我的环境以某种方式给我一个“非交易”会话吗?! 我的DAO中sessionFactory的transactionManager属性为null。

将@Transactional添加到“findByName”解决了这个问题,但是对于这个方法,不需要任何事务......

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

来自spring documentation

  

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

来自JBoss Wiki

  

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

更多:

答案 1 :(得分: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类。