Java 有没有办法控制JPA级联删除顺序?
我将barebones JPA与Hibernate一起作为一个提供者使用——我没有使用任何Hibernate特定的功能。我有一个实体,其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
@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,因为实体的MtMEntity\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提供商的,我想对此没有什么可做的。或者解决方案过于复杂和不可移植,因此不值得 请注意,订购将不起作用。若首先删除组之前的实体,则会丢失对相关组的引用。在大多数情况下,由于外键约束,删除实体甚至会失败