Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA/Hibernate,在多个主机上删除';t删除联接表记录_Hibernate_Jpa - Fatal编程技术网

JPA/Hibernate,在多个主机上删除';t删除联接表记录

JPA/Hibernate,在多个主机上删除';t删除联接表记录,hibernate,jpa,Hibernate,Jpa,这个问题已经被问过很多次了,但在我的情况下,我想不出答案 我有这门课,和本体论有很多关系。这是一个片段: @MappedSuperclass public abstract class FreeTextTerm extends Identifiable { ... @ManyToMany( targetEntity = OntologyEntry.class, cascade = { CascadeType.MERGE, CascadeType.PERSIST, Cascade

这个问题已经被问过很多次了,但在我的情况下,我想不出答案

我有这门课,和本体论有很多关系。这是一个片段:

@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 ()
  ...
}
@MappedSuperclass
公共抽象类FreeTextTerm扩展了
{
...
@ManyToMany(targetEntity=OntologyEntry.class,cascade={
CascadeType.MERGE、CascadeType.PERSIST、CascadeType.REFRESH})
@JoinTable(joinColumns=@JoinColumn(name=“owner\u id”)、inverseJoinColumns=@JoinColumn(name=“oe\u id”))
@抑制警告(“未选中”)
公共集getOntologyTerms()
...
}
我没有对称方面的OntologyEntry.freeTextTerms(),因为我不需要它,而且它们不能很好地处理多态性

现在,当我从HQL中的子类中删除记录时(例如,从ExperimentalPropertyValue,或Unit),Hibernate完全忽略相应联接表中的记录(例如,当我删除单元实例时,它忽略了Unit_到_条目,通过日志验证),如果当前所有者有这样的链接,则会导致外键冲突

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

那么,Hibernate忽略这些链接真是垃圾吗?(经过多年的经验,我真的很讨厌冬眠)。我是否必须使用@PreRemove,如中所述,还是有更清洁的解决方案


提前感谢。

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

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


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

好的,HQL中的批处理语句似乎是垃圾,它们完全忽略关系依赖项:。我对ORM很失望

在你的问题中发布相关代码。谢谢。相关的代码在GitHub中,并在上面精确地链接:它不在您的问题中,因为它应该是这样的。我的意思是,相关的代码应该逐字逐句地在问题中。不作为github的链接。现在或两年后(当github项目不再存在,或者代码发生了根本性的变化时),人们应该能够阅读这个问题,并且只阅读这个问题,然后找到相关的代码。我非常确定这个项目将继续存在,我不同意复制/粘贴大量代码的政策,但我会这样做。不,因为还有其他层次结构,与其他表和策略映射。我认为问题在于HQL完全忽略了@manytomy,正在对此进行调查。无论如何,谢谢你的提醒。