Java JPA保存,多个实体在Spring@Transactional内时不回滚,并且启用了针对Exception.class的回滚

Java JPA保存,多个实体在Spring@Transactional内时不回滚,并且启用了针对Exception.class的回滚,java,spring,spring-boot,transactions,spring-data-jpa,Java,Spring,Spring Boot,Transactions,Spring Data Jpa,我已经做了好几个小时了,当我在封装事务中保存实体时,我找不到一种方法来绕过似乎是JPARepository的自动启动/提交事务 我总共创建了3个实体。 第一个2、ClientAdmin和CreditPot将被创建,因此当第三个机构实体被创建时,这些实体可以在被持久化之前形成关系 当抛出异常时,我希望它不会提交所创建的实体(即整个过程回滚) 目前,我可以在日志中看到JPA Save方法可能会启动自己的事务(我不完全理解日志),这会导致调用repo.Save(entity)的实体在自己的事务中提交

我已经做了好几个小时了,当我在封装事务中保存实体时,我找不到一种方法来绕过似乎是JPARepository的自动启动/提交事务

我总共创建了3个实体。 第一个2、
ClientAdmin
CreditPot
将被创建,因此当第三个
机构
实体被创建时,这些实体可以在被持久化之前形成关系

当抛出异常时,我希望它不会提交所创建的实体(即整个过程回滚)

目前,我可以在日志中看到JPA Save方法可能会启动自己的事务(我不完全理解日志),这会导致调用
repo.Save(entity)
的实体在自己的事务中提交

任何帮助都将不胜感激

    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void createInstitution(InstitutionSignUpForm form) throws Exception {

    //Create Admin account.
    ClientAdmin clientAdmin = new ClientAdmin();
    clientAdmin.setRole(roleRepo.findOneByRole("SUPER_ADMIN").orElseThrow(() -> new Exception("Can not resolve role SUPER_ADMIN")));
    clientAdmin.setPassword(passwordEncoder.encode(form.getPassword()));
    clientAdmin.setUsername(form.getUsername());
    clientAdmin = clientAdminRepo.save(clientAdmin);

    //Create Credit Pot for institution.
    CreditPot creditPot = new CreditPot();
    creditPot.setIsPrimaryPot(true);
    creditPot.setName("Primary Credit Pot");
    creditPot.setCredits(300L);
    creditPot = creditPotRepo.save(creditPot);

    System.out.println("Throwing Exception.");
    if(1==1) throw new Exception("!!!", new Throwable("!!!"));

    //Create institution and assign relationships.
    Institution institution = new Institution();
    institution.setDiceCode(dicewareGenerator.generateRandomPassword(6));
    institution.setName(form.getInstitutionName());
    institution.setPrimaryCreditPot(creditPot);
    clientAdmin.setInstitution(institution);
    institutionRepo.saveAndFlush(institution);
}
日志:

    2019-09-12 10:46:41.148 DEBUG 24621 --- [nio-5000-exec-6] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2019-09-12 10:46:41.148 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.149 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.149 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(652375272<open>)] for JPA transaction
2019-09-12 10:46:41.149 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [com.j3den.edu.webserver.services.sigup.InstitutionSignUpService.createInstitution]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-java.lang.Exception
2019-09-12 10:46:41.150 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@74972cba]
2019-09-12 10:46:41.150 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.jdbc.datasource.ConnectionHolder@19e50439] for key [HikariDataSource (HikariPool-1)] to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.150 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Initializing transaction synchronization
2019-09-12 10:46:41.150 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.TransactionInterceptor           : Getting transaction for [com.j3den.edu.webserver.services.sigup.InstitutionSignUpService.createInstitution]
2019-09-12 10:46:41.150 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@304f1d77] for key [public abstract java.util.Optional com.j3den.edu.models.repos.RoleRepo.findOneByRole(java.lang.String)] to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.151 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.TransactionInterceptor           : No need to create transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findOneByRole]: This method is not transactional.
2019-09-12 10:46:41.151 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.151 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.153 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@304f1d77] for key [public abstract java.util.Optional com.j3den.edu.models.repos.RoleRepo.findOneByRole(java.lang.String)] from thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.242 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@2d5257a2] for key [public abstract java.lang.Object org.springframework.data.repository.CrudRepository.save(java.lang.Object)] to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.242 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.242 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(652375272<open>)] for JPA transaction
2019-09-12 10:46:41.242 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@19e50439] for key [HikariDataSource (HikariPool-1)] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.243 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Participating in existing transaction
2019-09-12 10:46:41.243 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2019-09-12 10:46:41.243 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.244 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2019-09-12 10:46:41.245 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@2d5257a2] for key [public abstract java.lang.Object org.springframework.data.repository.CrudRepository.save(java.lang.Object)] from thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.245 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@2d5257a2] for key [public abstract java.lang.Object org.springframework.data.repository.CrudRepository.save(java.lang.Object)] to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.245 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.245 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(652375272<open>)] for JPA transaction
2019-09-12 10:46:41.245 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@19e50439] for key [HikariDataSource (HikariPool-1)] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.245 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Participating in existing transaction
2019-09-12 10:46:41.245 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2019-09-12 10:46:41.245 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] bound to thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.246 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2019-09-12 10:46:41.247 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@2d5257a2] for key [public abstract java.lang.Object org.springframework.data.repository.CrudRepository.save(java.lang.Object)] from thread [http-nio-5000-exec-6]
Throwing Exception.
2019-09-12 10:46:41.247 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.TransactionInterceptor           : Completing transaction for [com.j3den.edu.webserver.services.sigup.InstitutionSignUpService.createInstitution] after exception: java.lang.Exception: !!!
2019-09-12 10:46:41.247 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.RuleBasedTransactionAttribute    : Applying rules to determine whether transaction should rollback on java.lang.Exception: !!!
2019-09-12 10:46:41.247 TRACE 24621 --- [nio-5000-exec-6] o.s.t.i.RuleBasedTransactionAttribute    : Winning rollback rule is: RollbackRuleAttribute with pattern [java.lang.Exception]
2019-09-12 10:46:41.247 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Initiating transaction rollback
2019-09-12 10:46:41.247 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Rolling back JPA transaction on EntityManager [SessionImpl(652375272<open>)]
2019-09-12 10:46:41.248 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Clearing transaction synchronization
2019-09-12 10:46:41.248 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.jdbc.datasource.ConnectionHolder@19e50439] for key [HikariDataSource (HikariPool-1)] from thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.248 DEBUG 24621 --- [nio-5000-exec-6] o.s.orm.jpa.JpaTransactionManager        : Not closing pre-bound JPA EntityManager after transaction
2019-09-12 10:46:41.248 TRACE 24621 --- [nio-5000-exec-6] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.orm.jpa.EntityManagerHolder@5ed67928] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@70286b92] from thread [http-nio-5000-exec-6]
2019-09-12 10:46:41.248 DEBUG 24621 --- [nio-5000-exec-6] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2019-09-12 10:46:41.148调试24621---[nio-5000-exec-6]o.j.s.OpenEntityManagerViewInterceptor:在OpenEntityManagerViewInterceptor中打开JPA EntityManager
2019-09-12 10:46:41.148跟踪24621---[nio-5000-exec-6].s.TransactionSynchronizationManager:绑定值[org.springframework.orm.jpa。EntityManagerHolder@5ed67928]对于键[org.springframework.orm.jpa]。LocalContainerEntityManagerFactoryBean@70286b92]到线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.149跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:检索值[org.springframework.orm.jpa。EntityManagerHolder@5ed67928]对于键[org.springframework.orm.jpa]。LocalContainerEntityManagerFactoryBean@70286b92]绑定到线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.149调试24621---[nio-5000-exec-6]o.s.orm.jpa.JpaTransactionManager:为jpa事务找到了线程绑定的EntityManager[SessionImpl(652375272)]
2019-09-12 10:46:41.149调试24621---[nio-5000-exec-6]o.s.orm.jpa.JpaTransactionManager:创建名为[com.j3den.edu.webserver.services.sigup.InstitutionSignUpService.createInstitution]的新事务:需要传播,默认隔离,-java.lang.Exception
2019-09-12 10:46:41.150调试24621---[nio-5000-exec-6]o.s.orm.jpa.JpaTransactionManager:将jpa事务公开为JDBC[org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@74972cba]
2019-09-12 10:46:41.150跟踪24621---[nio-5000-exec-6].s.TransactionSynchronizationManager:绑定值[org.springframework.jdbc.datasource。ConnectionHolder@19e50439]将键[HikariDataSource(HikariPool-1)]发送到线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.150跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:初始化事务同步
2019-09-12 10:46:41.150跟踪24621---[nio-5000-exec-6]o.s.t.i.TransactionInterceptor:获取[com.j3den.edu.webserver.services.sigup.InstitutionSignUpService.createInstitution]的事务
2019-09-12 10:46:41.150跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:绑定值[org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@304f1d77]对于键[public abstract java.util.Optional com.j3den.edu.models.repos.RoleRepo.findOneByRole(java.lang.String)]到线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.151 TRACE 24621---[nio-5000-exec-6]o.s.t.i.TransactionInterceptor:无需为[org.springframework.data.jpa.repository.support.SimpleParepository.findOneByRole]创建事务:此方法不是事务性的。
2019-09-12 10:46:41.151跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:检索值[org.springframework.orm.jpa。EntityManagerHolder@5ed67928]对于键[org.springframework.orm.jpa]。LocalContainerEntityManagerFactoryBean@70286b92]绑定到线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.151跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:检索值[org.springframework.orm.jpa。EntityManagerHolder@5ed67928]对于键[org.springframework.orm.jpa]。LocalContainerEntityManagerFactoryBean@70286b92]绑定到线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.153跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:删除的值[org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@304f1d77]对于键[public abstract java.util.Optional com.j3den.edu.models.repos.RoleRepo.findOneByRole(java.lang.String)]来自线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.242跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:绑定值[org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@2d5257a2]对于键[public abstract java.lang.Object org.springframework.data.repository.crudepository.save(java.lang.Object)]到线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.242跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:检索值[org.springframework.orm.jpa。EntityManagerHolder@5ed67928]对于键[org.springframework.orm.jpa]。LocalContainerEntityManagerFactoryBean@70286b92]绑定到线程[http-nio-5000-exec-6]
2019-09-12 10:46:41.242调试24621---[nio-5000-exec-6]o.s.orm.jpa.JpaTransactionManager:为jpa事务找到了线程绑定的EntityManager[SessionImpl(652375272)]
2019-09-12 10:46:41.242跟踪24621---[nio-5000-exec-6].s.t.s.TransactionSynchronizationManager:检索值[org.springframework.jdbc.datasource。ConnectionHolder@19e50439]对于绑定到线程[http-nio-5000-exec-6]的键[HikariDataSource(hikariol-1)]
2019-09-12 10:46:41.243调试24621---[nio-5000-exec-6]o.s.orm.jpa.JpaTransactionManager:参与现有事务
2019-09-12 10:46:41.24
spring.jpa.database-platform=org.hibernate.dialect.MySQL57InnoDBDialect`
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.jpa.database-platform=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb