Java @事务性启动在Spring引导中不起作用
我希望在spring boot中使用@Transactional,但是经过几次尝试后,我无法让事务正常工作,尽管内部有一个要回滚的异常,所以我错过了一些东西 AppConfig.javaJava @事务性启动在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
@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