我使用准系统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))
有没有办法控制什么时候删除的顺序?我很想在主要删除之后执行这些级联删除,这样条件就没用了。我也真的不想把这个逻辑带出数据库层。
谢谢!
答案 0 :(得分:1)
在这种情况下,最好首先选择要删除的实体的ID,然后发出第二个JPQL查询以删除具有此特定ID的实体。
您观察到的行为是特定于您的JPA提供商的,我想这没有什么可做的。或者解决方案太复杂且不便携,不值得。
请注意,订购不起作用。如果您先在组之前删除实体,则会丢失对相关组的引用。在大多数情况下,由于外键约束,删除实体甚至会失败。