使用JPA DSL删除级联

时间:2015-06-22 12:58:03

标签: java jpa

我需要删除一个带有子实体的实体。这是我的代码:

public void deleteCascade(Integer entityId) {
  CriteriaBuilder cb = em.getCriteriaBuilder();
  CriteriaDelete<MyEntity> criteriaDelete = cb.createCriteriaDelete(MyEntity.class);
  Root<MyEntity> myEntity = criteriaDelete.from(MyEntity.class);
  criteriaDelete.where(
          cb.equal(MyEntity.get(MyEntity_.id), entityId)
  );
  em.createQuery(criteriaDelete).executeUpdate();
}

由于孤儿,这显然不起作用。我知道2个不能让我满意的解决方案:

  • 手动删除孤儿,每个实体一个请求。
  • 激活实体属性。

我实际上更喜欢在某个地方使用一个简单的参数,但是如果它存在则找不到。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  • 解决方案1.有两个查询:

    1. 删除所有未来的孤儿(即BULK DELETE,而不是每个实体的查询)。
    2. 删除实体本身。
  • 解决方案2:我不确定这与你的第二个想法不一样: 标记与orphanRemoval=true

  • 的关系