【问题标题】:Hibernate HQL bulk delete don't remove join table valuesHibernate HQL 批量删除不删除连接表值
【发布时间】:2015-03-14 10:56:37
【问题描述】:

我有一些 Jpa 实体:

@Entity
public class Parent{
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy(" date DESC")
List<Child> childList = new ArrayList<Child>();
private boolean enabled;

}

@Entity
public class Child{
    private LocalDateTime date;
}

我想使用批量 HQL 查询删除父级和所有子级。 因此,我首先加载要删除的所有父实体:

String query = "SELECT p.id FROM Parent p WHERE p.enabled=true";
    TypedQuery<Long> q = entityManager.createQuery(query , Long.class);     
    List<Long> parentId= q.getResultList();

然后我选择所有要删除的孩子

    String query = "SELECT c.id FROM Parent p JOIN p.childList c WHERE p.id=:parentId";
    q = entityManager.createQuery(query , Long.class);
    q.setParameter("parentId", parentId);
    List<Long> childId= q.getResultList();

然后我尝试删除子实体:

     String queryDeleteChild = "DELETE FROM Child c WHERE c.id IN :childId";
    q2 = entityManager.createQuery(queryDeleteChild );
    q2.setParameter("childId", childId);
    q2.executeUpdate();

但在这一点上我有一个例外:

     14/03/2015 11:39:38 ERROR SqlExceptionHelper:146 - Referential
        integrity constraint violation: "FK_K1BX38JRPVSWUSYJP28LBYGCN:     
PUBLIC.PARENT_CHILD FOREIGN KEY(CHILDLIST_ID) REFERENCES PUBLIC.CHILD(ID) 
1751)"; SQL statement:
    delete from Child where id in (?) [23503-186]

我无法解释为什么连接表 PARENT_CHILD 中的值没有被删除。 有一种方法可以在不使用批量 native 查询的情况下做到这一点吗?

谢谢

【问题讨论】:

    标签: java hibernate jpa cascade


    【解决方案1】:

    由于 JPQL Bulk Delete 不会级联任何东西(这就是它的全部意义),所以这是可以预料的。如果您想要级联,请使用普通 JPA remove

    【讨论】:

      猜你喜欢
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多