Java 没有活动事务,合并无效

Java 没有活动事务,合并无效,java,spring,hibernate,transactions,spring-transactions,Java,Spring,Hibernate,Transactions,Spring Transactions,我正在创建一个独立的单元测试(它使用Spring自动连接一些依赖项)来测试第三方JAR中函数的功能 要测试的函数是“updateRule”,它更新数据库中的一个实体。从代码中,我可以看到这个函数使用了“@Transactional”注释。(此处无法共享第三方JAR) 但是,在运行测试时,updateRule函数会失败 “没有活动事务,合并无效” 我相信我已经正确配置了Spring设置,在函数实现中激活@Transactional注释,如下所示: 1) Spring配置[编辑为使用Spring的L

我正在创建一个独立的单元测试(它使用Spring自动连接一些依赖项)来测试第三方JAR中函数的功能

要测试的函数是“updateRule”,它更新数据库中的一个实体。从代码中,我可以看到这个函数使用了“@Transactional”注释。(此处无法共享第三方JAR)

但是,在运行测试时,updateRule函数会失败 “没有活动事务,合并无效”

我相信我已经正确配置了Spring设置,在函数实现中激活@Transactional注释,如下所示:

1) Spring配置[编辑为使用Spring的LocalSessionFactoryBean]:

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackageClasses = {RulesServiceImpl.class, RulesDaoImpl.class})
public class SpringConfig {

    @Bean(name="transactionManager")
    public HibernateTransactionManager createHibernateTxnMgr(){
        HibernateTransactionManager txnMgr = new  HibernateTransactionManager();
        txnMgr.setSessionFactory(sessionFactoryBean().getObject());     
        return txnMgr;
    }

    @Bean
    public AbstractSessionFactoryBean sessionFactoryBean(){
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
        return sessionFactoryBean;
    }

}
2) Junit测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class TestAppContextCration {

    @Autowired
    private IRulesService rulesService;

    @Test
    public void test() {
        Rule rule = new Rule();
        rulesService.updateRule(rule);
    }

}
3) 使用的hibernate util:

 public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure().buildSessionFactory();
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void shutdown() {
        // Close caches and connection pools
        getSessionFactory().close();
    }

}
我的配置:

弹簧:弹簧试验-3.1.1.释放


注意:正如我在调试测试时确认的那样,自动连线工作正常。

删除您的
HibernateUtil
类,并使用Spring配置您的
SessionFactory
。Spring需要与hibernate集成以实现正确的tx管理。TransactionManager创建中sessionFactory的设置不解决这个问题吗?就像在SpringConfig中一样。上面的java类?否。Spring需要设置当前会话上下文属性,而这不是由事务管理器完成的。当然,这是我所指的行:txnMgr.setSessionFactory(HibernateUtil.getSessionFactory());是的,我知道是哪一行。