休眠5 + JPA 2不级联删除了连接表
问题描述:
我们有这样的关系:休眠5 + JPA 2不级联删除了连接表
public class RuleProviderEntity implements Serializable
{
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@OrderColumn(name = RuleEntity.RULE_SEQUENCE)
private List<RuleEntity> rules;
}
仅这一点就创建一个连接表2个键和RULE_SEQUENCE列。到目前为止很好,适用于SELECT。
现在有一个JQL查询
DELETE FROM RuleProviderEntity WHERE ...
但这不能级联删除RuleEntity
行。它只是删除了RuleProviderEntity
,并且保留了完整的RuleEntity
。
这是应该在JPA 2中工作,它是一个Hibernate的bug,或者我在配置中丢失了一些东西?
我知道我可以添加@JoinTable
但它只会覆盖默认值。
另外orphanRemoval
在这里似乎没有必要。
也许我可以用@PreRemove
做一个解决方法,但不知道如何。
答
您的意思是发出JPQL批量删除查询?而不是em.remove()
。
批量删除查询绝不会考虑级联语义,并且不打算(也不会保留内存中的托管对象与数据存储一致)。如果你想级联,那么你需要拨打em.remove()
。如果对JPA规范的这种看法有疑问。
好的谢谢。我迄今没有使用批量删除,所以我从来不知道:)但我很惊讶规范不需要可选的级联。 –
我的想法是这样的: 可能有一个实体具有相同的'RuleEntityProvider'集合,与大容量的'DELETE'相匹配。如果我调用'em.remove()',它将会级联,并且第三级嵌套的'RuleEntity'实体也将被删除。那么为什么不从DELETE语句中级联呢。 –
不能明白为什么任何级联应该是可选的。批量删除可以在不需要从数据存储中获取数据的情况下进行批量操作,并且由于“级联”需要JPA提供者检查所有要删除的对象,计算级联,然后删除这些等,因此无法完成。 –