java - Spring JPA - 如何在事务中强制自定义存储库调用顺序

标签 java spring hibernate spring-data-jpa

使用Spring Data JPA 1.11.6.RELEASE,我遇到以下问题;

通过它们之间简单的一对多关系,我有 TableA ,和TableB ,其中A包含多个B 。我有 TableB 的存储库使用自定义删除方法;

public interface BRepository extends JpaRepository<TableB, String> {
    @Modifying
    void deleteByTableA(TableA tableA);
}

其中删除FK值,即TableA的PK

在我的服务类中,我使用这些;

@Service
public class TheService {

    @Autowired
    private ARepository aRepository;
    @Autowired
    private BRepository bRepository;

    @Transactional
    public void deleteInsert(List<TableB> bList) {
        TableA tableA = aRepository.findByEtc(...);
        bRepository.deleteByTableA(tableA);
        bRepository.save(bList);
    }
}

但问题是 @Transactional 里面的操作顺序方法根据 Hibernate 所做的优化而变化。因此,如果我有 TableB 的重复实体,则会导致一些唯一约束违规。存在于新表中。如果我输入 bRepository.count()在删除和保存调用之间进行调用,这会强制我的自定义顺序,但我想通过一些配置来实现此目的,而不是使用此类愚蠢的技巧。有没有办法实现这个目标?

最佳答案

看来你的问题的答案就在 Hibernate docs关于冲洗操作的顺序。根据 Hibernate JavaDocs,SQL 操作顺序是:

  • 插入
  • 更新
  • 删除集合元素
  • 集合元素的插入
  • 删除

您可能需要在第一次操作后手动刷新它:

@Transactional
public void deleteInsert(List<TableB> bList) {
    TableA tableA = aRepository.findByEtc(...);
    bRepository.deleteByTableA(tableA);
    bRepository.flush();

    bRepository.save(bList);
}

或者尝试用更新操作代替“删除+插入”操作。

关于java - Spring JPA - 如何在事务中强制自定义存储库调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46140112/

相关文章:

java - Angular 7 - 从 Angular 重定向到 jsp 页面

Spring MockRestServiceServer 处理对同一 URI 的多个请求(自动发现)

hibernate - Jackson JSON View 与几何

java - 我必须将 hibernate 设置为 weblogic 吗?

Java Swing - 使用定时器刷新 jTable

java - 如何正确处理服务器端和客户端的时间节省问题

java - 如何检查 PDF 阅读器是否安装了 Java

java - Wildfly 8.2 : importing wildcard certificate, 中间证书丢失

java - 多模块项目中 JPA 存储库的 @Autowire 失败

java - 使用 JPA @version 注释的字段是否需要 getter 和 setter?