gpt4 book ai didi

java - Spring data JPA 保存全部或不保存以及异常回滚

转载 作者:太空宇宙 更新时间:2023-11-04 09:12:43 25 4
gpt4 key购买 nike

嵌套调用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> {
}

假设 DAOService 层具有如下所示的方法:

persistA(){
persistB(b)
aRepository.save(a);
}

persistB(B b){
bRepository.save(b);
}

persistC(C b){
cRepository.save(c);
}

persistAll(){
persistA(a);
persistC(c);
}

这里的要求是将所有数据库对象(A、B 和 C)保存为同一事务的一部分,并且该事务应该是新的。如果在保存任何对象期间发生异常(检查异常,因为运行时异常已经回滚所有内容),则不应保存任何内容。这意味着要么所有内容都保存到数据库,要么什么都不保存。

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

  1. https://www.ibm.com/developerworks/library/j-ts1/index.html
  2. https://www.baeldung.com/spring-transactional-propagation-isolation

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

@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 Transaction 是否启动了一个新事务:

TransactionAspectSupport.currentTransactionStatus().isNewTransaction();

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

关于java - Spring data JPA 保存全部或不保存以及异常回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59485405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com