有没有办法控制JPA级联删除排序?

时间:2015-10-20 23:52:38

标签: java jpa

我使用准系统JPA和Hibernate作为提供者 - 我没有使用任何特定于Hibernate的功能。我有一个@ManyToMany字段的实体,该字段映射到另一个双列MtM表Groups,并为此MtM表的字段指定了CASCADE DELETE

删除级联一切正常。当我需要从数据库中删除我的一个实体时,问题出现了:

    String jpql = "DELETE FROM Entity e WHERE e.id = :id AND :g MEMBER OF e.groups"
    Query tq = em.createQuery(jpql);
    tq.setParameter("id", 42);
    tq.setParameter("g", myGroup);
    long rows = tq.executeUpdate();
    if (rows == 0) throw new Exception();       

上述查询的第二个条件似乎总是假的,因为在实体删除发生之前删除了实体的MtM entity_group条目。如果我打开查询日志记录,我会看到类似的内容:

delete from **entity_group** where (entity_id) in (select id from entity where id=?)
delete from entity where id=? and (? in (select groups1_.group_id from **entity_group** groups1_ where entity.id=groups1_.entity_id))

有没有办法控制什么时候删除的顺序?我很想在主要删除之后执行这些级联删除,这样条件就没用了。我也真的不想把这个逻辑带出数据库层。

谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,最好首先选择要删除的实体的ID,然后发出第二个JPQL查询以删除具有此特定ID的实体。

您观察到的行为是特定于您的JPA提供商的,我想这没有什么可做的。或者解决方案太复杂且不便携,不值得。

请注意,订购不起作用。如果您先在组之前删除实体,则会丢失对相关组的引用。在大多数情况下,由于外键约束,删除实体甚至会失败。