JPA / Hibernate,ManyToMany上的Delete不会删除连接表记录

时间:2015-01-27 11:56:35

标签: hibernate jpa

其他一些问题已被问过,但在我的案例中我无法找到答案。

我有这个类http://tinyurl.com/nrhbnna,与OntologyEntry有一个ManyToMany关系。这是一个片段:

@MappedSuperclass
public abstract class FreeTextTerm extends Identifiable
{
  ...
  @ManyToMany( targetEntity = OntologyEntry.class, cascade = { 
    CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH } )
  @JoinTable ( joinColumns = @JoinColumn ( name = "owner_id" ), inverseJoinColumns = @JoinColumn ( name = "oe_id" ) )
  @SuppressWarnings ( "unchecked" )
  public <OE extends OntologyEntry> Set<OE> getOntologyTerms ()
  ...
}

我没有对称端OntologyEntry.freeTextTerms(),因为我不需要它,并且它们在多态性方面效果不佳。

现在,当我从HQL中删除子类中的记录时(例如,来自ExperimentalPropertyValue,http://tinyurl.com/mydgnwr或Unit,http://tinyurl.com/lu28sfu),Hibernate完全忽略了各个连接表中的记录(例如,它忽略了unit_onto_entry) ,当我删除单位实例时,通过日志验证),如果当前所有者拥有此类链接,则会导致外键违规。

我已经知道当你尝试从多对多关系的非所有者方面删除时会发生这种情况,但事实并非如此。此外,我不认为CascadeType.DELETE会在这里提供帮助,因为我不想删除子项(即本体条目),只是指向它们的链接。

那么,Hibernate是否会忽略这些链接? (经过多年的经验,我真的很讨厌Hibernate)。我是否必须按照http://tinyurl.com/kgpk92a中的说明使用@PreRemove,还是有更清洁的解决方案?

提前致谢。

2 个答案:

答案 0 :(得分:0)

我认为问题来自在@MappedSuperclass中使用@ManyToMany。 MappedSuperclass本身并不是一个实体,假设不同的(多个)类扩展它并使用放在里面的定义。如果所有子实体(具有不同的主键序列)将使用相同的manytomany链接表问题,则很可能会发生。

正如我在实体“ExperimentalPropertyValue”中看到的那样,您尝试使用单表继承策略。

解决方案是放弃MappedSuperclass,并将继承定义移动到您也定义为实体的FreeTextTerm。

答案 1 :(得分:0)

好的,似乎HQL中的批处理语句是垃圾,它们完全忽略了关系依赖关系:http://twasink.net/2005/04/20/differences-in-behaviour-between-hibernate-delete-queries-and-the-old-way/。我对ORM感到非常沮丧......