Java Spring数据JPA全部保存或无保存和异常回滚
嵌套调用JpaRepository.save(),要求保存全部或无 DAO是: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{ }
@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引导。