Java Spring数据JPA全部保存或无保存和异常回滚

Java Spring数据JPA全部保存或无保存和异常回滚,java,transactions,spring-data-jpa,Java,Transactions,Spring Data Jpa,嵌套调用JpaRepository.save(),要求保存全部或无 DAO是: @Entity @Table(name = "A") public class A implements Serializable{ } @Entity @Table(name = "B") public class B implements Serializable{ } @Entity @Table(name = "C") public class C implements Serializable{ }

嵌套调用JpaRepository.save(),要求保存全部或无

DAO是:

@Entity
@Table(name = "A")
public class A implements Serializable{
}

@Entity
@Table(name = "B")
public class B implements Serializable{
}

@Entity
@Table(name = "C")
public class C implements Serializable{
}
存储库包括:

public interface ARepository extends JpaRepository<A, String> {
}

public interface BRepository extends JpaRepository<B, String> {
}

public interface CRepository extends JpaRepository<C, String> {
}
这里的要求是所有数据库对象(A、B和C)只作为同一事务的一部分保存,并且应该是新的。如果在保存任何对象期间出现异常(选中异常,因为运行时异常已回滚所有内容),则不应保存任何内容。这意味着要么将所有内容保存到DB,要么什么也不保存

根据以下链接中共享的信息:

  • 我通过以下方式实现了这一点:

    @Transactional(propagation  = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    persistAll(){
    
    }
    
    @Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
    persistA(){
    }
    
    @Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
    persistB(B b){
    }
    
    @Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
    persistC(C c){
    }
    
    是否有办法检查同一事务是否用于保存a、B和C

    另外,我想知道下面的代码片段

    @Transactional(propagation  = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    persistAll(){
    
    }
    
    @Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
    persistA(){
    }
    
    @Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
    persistB(B b){
    }
    
    @Transactional(propagation  = Propagation.REQUIRED, rollbackFor = Exception.class)
    persistC(C c){
    }
    
    相当于:

    @Transactional(propagation  = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    persistAll(){
    
    }
    
    
    persistA(){
    }
    
    persistB(B b){
    }
    
    
    persistC(C c){
    }
    

    您无法获取事务id或类似信息。但您可以检查Spring事务是否启动了新事务:

    TransactionAspectSupport.currentTransactionStatus().isNewTransaction();
    

    因此,在
    persistAll()
    中,它应该返回true,在所有其他方法中返回false。

    您无法获得事务id或类似的内容。但您可以检查Spring事务是否启动了新事务:

    TransactionAspectSupport.currentTransactionStatus().isNewTransaction();
    

    因此在
    persistAll()
    中,它应该返回true,在所有其他方法中返回false。

    根据定义,它在同一事务中。你为什么要检查这个?正如你说的“根据定义,它在同一个事务中”,我只是想确认一下。所以,我想知道这是否可以检查@根据定义,SimonMartinelliIt在同一笔交易中。你为什么要检查这个?正如你说的“根据定义,它在同一个事务中”,我只是想确认一下。所以,我想知道这是否可以检查@SimonMartinelliI已经按照我正在经历的一个线程中的建议尝试了这个。我遇到了以下错误:org.springframework.transaction.notTransactionException:范围内没有事务方面管理的TransactionStatus。我甚至尝试过使用TransactionSynchronizationManager.isActualTransactionActive(),但没有成功。没有得到任何信息。我有一个spring启动应用程序。在应用程序运行时,我已经公开了一个rest端点来触发数据库插入/保存操作。在这里,您可以调用TransactionSpectSupport.currentTransactionStatus().isNewTransaction();您所处的方法具有@Transactional注释?您使用的是Spring Boot还是Spring?如果只有Spring,您如何配置TransactionManager?使用Spring引导。我已经根据我正在经历的一个线程中的建议尝试过了。我遇到了以下错误:org.springframework.transaction.notTransactionException:范围内没有事务方面管理的TransactionStatus。我甚至尝试过使用TransactionSynchronizationManager.isActualTransactionActive(),但没有成功。没有得到任何信息。我有一个spring启动应用程序。在应用程序运行时,我已经公开了一个rest端点来触发数据库插入/保存操作。在这里,您可以调用TransactionSpectSupport.currentTransactionStatus().isNewTransaction();您所处的方法具有@Transactional注释?您使用的是Spring Boot还是Spring?如果只有Spring,您如何配置TransactionManager?使用Spring引导。