Spring JPA - 如何在事务

时间:2017-09-10 11:15:48

标签: java spring hibernate spring-data-jpa

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

在它们之间有一个简单的1对n关系,我有TableATableB,其中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的重复实体,则会导致一些唯一约束违规。如果我在删除&amp;之间拨打bRepository.count()电话保存电话,这会强制我的自定义订单,但我想通过一些配置来实现这一点而不是如此愚蠢的技巧。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

似乎问题的答案在于Hibernate docs关于刷新操作的顺序。根据Hibernate JavaDocs,SQL操作顺序是:

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

您可能希望在第一次操作后手动冲洗它:

</ion-infinite-scroll>

或尝试替换&#34;删除+插入&#34;使用更新操作进行操作。