【问题标题】:JPA/Hibernate, Delete on ManyToMany doesn't delete join table recordsJPA/Hibernate,ManyToMany 上的 Delete 不会删除连接表记录
【发布时间】:2015-01-27 11:56:35
【问题描述】:

这个问题已经被问过很多次了,但我无法在我的案例中找到答案。

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

@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,还是有更清洁的解决方案?

提前致谢。

【问题讨论】:

  • 在您的问题中发布相关代码。
  • 谢谢 JB。相关代码在 GitHub 中,上面有链接
  • 准确地说:这不是你应该的问题。
  • 我的意思是相关代码应该逐字出现在问题中。不像 github 的链接。一个人应该能够阅读问题并且只有问题,现在或 2 年后(当 github 项目将不再存在,或者代码已经发生根本性变化时),并找到相关代码。
  • 我很确定该项目将保留在那里,我不同意复制/粘贴大量代码的政策,但我会这样做。

标签: hibernate jpa


【解决方案1】:

我认为问题来自于在 @MappedSuperclass 中使用 @ManyToMany。 MappedSuperclass 本身不是一个实体,并且假定不同的(多个)类扩展它并使用其中的定义。如果所有子实体(具有不同的主键序列)都使用相同的多对多链接表,则很可能会出现问题。

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

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

【讨论】:

  • 不,因为还有其他层次结构,映射到其他表和策略。我认为问题在于 HQL 完全忽略了@ManyToMany,对其进行了调查。
  • 感谢您的提醒。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2018-07-03
    • 2011-06-27
    • 1970-01-01
    • 2014-03-04
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多