Java @事务性启动在Spring引导中不起作用

Java @事务性启动在Spring引导中不起作用,java,spring,hibernate,transactions,spring-boot,Java,Spring,Hibernate,Transactions,Spring Boot,我希望在spring boot中使用@Transactional,但是经过几次尝试后,我无法让事务正常工作,尽管内部有一个要回滚的异常,所以我错过了一些东西 AppConfig.java @EnableAutoConfiguration @ComponentScan(basePackages = { "com.geopro" }) @EnableJpaRepositories(basePackages = { "com.geopro.repositories" }) @EntityScan(ba

我希望在spring boot中使用@Transactional,但是经过几次尝试后,我无法让事务正常工作,尽管内部有一个要回滚的异常,所以我错过了一些东西

AppConfig.java

@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.geopro" })
@EnableJpaRepositories(basePackages = { "com.geopro.repositories" })
@EntityScan(basePackages = { "com.geopro.entities" })
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}
@Service("metier")
@Aspect
public class Metier {


    @Transactional(readOnly = false , rollbackFor = Exception.class)
    public void saveUpload(UploadData post) throws Exception {
        try {
            post.ADDEDDATA.savesync();
            post.UPDATEDDATA.savesync();

        } catch (Exception e) {
               throw e ;
        }

    }
Metier.java

@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.geopro" })
@EnableJpaRepositories(basePackages = { "com.geopro.repositories" })
@EntityScan(basePackages = { "com.geopro.entities" })
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}
@Service("metier")
@Aspect
public class Metier {


    @Transactional(readOnly = false , rollbackFor = Exception.class)
    public void saveUpload(UploadData post) throws Exception {
        try {
            post.ADDEDDATA.savesync();
            post.UPDATEDDATA.savesync();

        } catch (Exception e) {
               throw e ;
        }

    }

我的问题事务无法工作的原因是将AspectJ通知和事务混合在同一个类中,因此此选项
@EnableTransactionManagement(proxyTargetClass=true)
强制事务工作,但即使将它们放在专用类中,也会禁用AspectJ通知


因此,解决此问题的最佳解决方案是将AspectJ Advice放在一个专用类中,这样事务和AspectJ Advice将像预期的那样工作。

“尽管内部有一个要回滚的异常”-当然,如果发生异常,事务将回滚。在我的情况下,它不会回滚。没有太多要做的事情,也许你可以分享一个项目来演示这个问题。由于您的
Metier
服务没有实现接口,我想知道您是否需要
@EnableTransactionManagement(proxyTargetClass=true)
?@PhilWebb您的技巧非常有效,您救了我:D