春天4 @Transactional不起作用

时间:2016-07-15 08:36:19

标签: java spring spring-mvc transactions spring-data

我有一个Spring 4.3应用程序,配置简单,我希望我的服务类方法是事务性的,所以我在配置中启用事务管理,然后用@Transactional注释我的服务方法。我从我的控件中调用服务方法,但他们没有按预期行事。当方法的某些部分抛出异常回滚时,永远不会调用

AppInitializer.class:

@EnableTransactionManagement
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{WebConfig.class};
    }
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{RootConfig.class, SecurityConfig.class};
    }
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

RootConfig.class:

@Configuration
@EnableJpaRepositories(basePackages"package.repository"})
public class RootConfig {
    @Bean
    public DataSource dataSource() {
        ...
        return dataSource;
    }
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        ...
        return hibernateJpaVendorAdapter;
    }
    @Bean
    public EntityManagerFactory entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        ...
        return factory.getObject();
    }
    @Bean
    public JpaTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory());
    }
}

有没有人知道这里有什么问题

GitHub链接https://github.com/VadOs1/TRANSACTIONAL-ISSUE/

由于

1 个答案:

答案 0 :(得分:1)

你可以从AppInitializer类中删除@EnableTransactionManagement注释并在RootConfig类中启用它,并告诉我这是否适合你

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages"package.repository"})
public class RootConfig {
    @Bean
    public DataSource dataSource() {
        ...
        return dataSource;
    }
    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        ...
        return hibernateJpaVendorAdapter;
    }
    @Bean
    public EntityManagerFactory entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        ...
        return factory.getObject();
    }
    @Bean
    public JpaTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory());
    }
}