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