Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Java 继承不起作用的双向一对多(带hibernate 3.5.4的jpa)_Java_Hibernate_Jpa - Fatal编程技术网

Java 继承不起作用的双向一对多(带hibernate 3.5.4的jpa)

Java 继承不起作用的双向一对多(带hibernate 3.5.4的jpa),java,hibernate,jpa,Java,Hibernate,Jpa,我正试图建立一种双向的一对多关系。我遇到了一些麻烦,因为“多”端引用了一个抽象超类。当我在互联网上搜索可能的原因时,我发现这是一个已知的问题,但我无法为我的案例找到解决方案 我已经检查了博客上的解决方法,“单表,没有mappedBy”看起来像是一个解决方案,但我真的需要双向关联 以下是我试图映射的类: 拥有方 @Entity(name = "CC_Incl_Site") public class IncludedSite { @OneToMany(fetch=FetchType.LAZY

我正试图建立一种双向的一对多关系。我遇到了一些麻烦,因为“多”端引用了一个抽象超类。当我在互联网上搜索可能的原因时,我发现这是一个已知的问题,但我无法为我的案例找到解决方案

我已经检查了博客上的解决方法,“单表,没有mappedBy”看起来像是一个解决方案,但我真的需要双向关联

以下是我试图映射的类:

拥有方

@Entity(name = "CC_Incl_Site")
public class IncludedSite {
    @OneToMany(fetch=FetchType.LAZY, mappedBy = "includedSite")
    private Set<CtaContractBase> ctas = new HashSet<CtaContractBase>();

    @OneToMany(fetch=FetchType.LAZY, mappedBy = "includedSite")
    private Set<WoContractBase> wos = new HashSet<WoContractBase>();  
}
合同(SCContract的超类):

尝试运行应用程序时,我遇到以下异常:

mappedBy引用未知的目标实体属性: includedSite.ctas中的CtaContractBase.includedSite

另一个解决方案似乎是将SCContract中的@Entity注释替换为@MappedSuperClass,但这会导致另一个异常(使用@OneToMany或@ManyToMany针对未映射的类:StudyContract.contracts[SCContract]),因为在另一个类(StudyContract)中

@OneToMany(fetch=FetchType.LAZY,mappedBy=“studyContract”,targetEntity=SCContract.class)
@批量大小(大小=10)
私人合同;
正如博客解释的那样,使用这种方法已经不可能再拥有一个超类集合了


是否有其他解决方法或我遗漏了什么?

包含站点中的关联定义为

@OneToMany(fetch=FetchType.LAZY, mappedBy = "includedSite")
private Set<CtaContractBase> ctas = new HashSet<CtaContractBase>();
@OneToMany(fetch=FetchType.LAZY, mappedBy = "includedSite")
private Set<SCContract> ctas = new HashSet<SCContract>();

我认为这是可行的,因为继承的基本原则。这被记录为在hibernate中实现继承的方法。因此,没有办法以我期望的方式映射它?只有SCContract实例才能成为IncludedSite的一部分。所以,即使你把冬眠放在一边,用一套来保存它们也是错误的。最终可能会在集合中存储另一种CTAContBase,这在OO级别和关系级别上都是错误的。你不会把牛排放在蛋盒里,即使两者都是食物。这对你现在的例子来说是正确的,但在我的例子中,它更像是一个“食物>肉>鸡肉”的层次结构,在这个层次结构中,CTA ContractBase是链中的“肉”。在这种情况下,将几种肉放在一组肉中是有意义的。若我用一套普通的“食物”,我就可以在里面放一个“胡萝卜”,而我真的只需要肉。
@OneToMany(fetch = FetchType.LAZY, mappedBy = "studyContract", targetEntity = SCContract.class)
@BatchSize(size = 10)
private Set<SCContract> contracts;
@OneToMany(fetch=FetchType.LAZY, mappedBy = "includedSite")
private Set<CtaContractBase> ctas = new HashSet<CtaContractBase>();
@OneToMany(fetch=FetchType.LAZY, mappedBy = "includedSite")
private Set<SCContract> ctas = new HashSet<SCContract>();