使用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/