Java 定义使用弹簧时不在变速器中运行的方法´;事务管理与hibernate

Java 定义使用弹簧时不在变速器中运行的方法´;事务管理与hibernate,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我目前正在编写一个SpringWebMVC应用程序,几天前,我的第一个问题是我不知道如何使用Hibernate和spring的事务。现在一切都正常了,TransactionManager开始工作了,我可以成功地处理事务 这是我基于Java的spring配置的一部分: @Configuration @ComponentScan(basePackages = { "de.macomp.maipds" }) @EnableTransactionManagement public class MainC

我目前正在编写一个SpringWebMVC应用程序,几天前,我的第一个问题是我不知道如何使用Hibernate和spring的事务。现在一切都正常了,TransactionManager开始工作了,我可以成功地处理事务

这是我基于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”可以解决问题,但对于此方法,不需要任何事务


有什么想法吗?

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

@Transactional(readOnly = true)
public Publisher findByName(String name) {
   ...
}
发件人:

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

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

更多:



添加上述定义,并将您的服务或dao类标记为@Transactional annotation。

hm。我认为这是没有必要的,因为我使用基于Java的Spring配置配置了我的应用程序。您可以使用JavaConfig(@EnableTransactionManagement)启用事务,这是不需要的。确定。但它仍然打开了一个交易。。。我希望直接运行查询,而无需orm打开/开始事务并最终提交它。但是,如果我正确理解了您发布的问题链接中的第一个答案,我的问题的原因是hibernates内部行为…我已更新了我的答案:“不能将SQL语句发送到数据库事务之外的数据库”
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name="sessionFactory">
       <ref bean="mySessionFactory"/>
   </property>
</bean>

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