【发布时间】: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 项目将不再存在,或者代码已经发生根本性变化时),并找到相关代码。
-
我很确定该项目将保留在那里,我不同意复制/粘贴大量代码的政策,但我会这样做。