Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法控制JPA级联删除顺序?_Java_Jpa - Fatal编程技术网

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

Java 有没有办法控制JPA级联删除顺序?,java,jpa,Java,Jpa,我将barebones JPA与Hibernate一起作为一个提供者使用——我没有使用任何Hibernate特定的功能。我有一个实体,其@manytomy字段映射到另一个两列MtM表,组,并且为该MtM表的字段指定了级联删除 删除级联所有的工作正常。当我需要从数据库中删除一个实体时,问题就出现了: String jpql = "DELETE FROM Entity e WHERE e.id = :id AND :g MEMBER OF e.groups" Query tq = e

我将barebones JPA与Hibernate一起作为一个提供者使用——我没有使用任何Hibernate特定的功能。我有一个实体,其
@manytomy
字段映射到另一个两列MtM表,
,并且为该MtM表的字段指定了
级联删除

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

    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();       
上述查询的第二个条件似乎总是false,因为实体的MtM
Entity\u 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))
有没有办法控制删除内容的顺序?我真的希望在主删除之后执行这些级联删除,这样条件就不会无用了。我还真的不想把这种逻辑从DB层中去掉


谢谢

在此场景中,最好先选择要删除的实体的id,然后发出第二个JPQL查询来删除具有此特定id的实体

您观察到的行为是特定于您的JPA提供商的,我想对此没有什么可做的。或者解决方案过于复杂和不可移植,因此不值得

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