我正在尝试绘制双向一对多关系。我遇到了一些麻烦,因为“很多”方面引用了一个抽象的超类。在互联网上搜索可能的原因时,我发现这是一个已知问题,但我无法找到解决方案。
我已经检查了this博客上的变通方法,“单表,没有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>();
}
其他方面:
@Entity
public abstract class SCContract extends Contract {
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "incl_site_id")
private IncludedSite includedSite;
}
合同(SCContract的超类):
@Entity(name = "CC_CONTRACT")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "contractType", discriminatorType = DiscriminatorType.STRING)
@ForceDiscriminator
public abstract class Contract {
...
}
尝试运行应用程序时,我遇到了这个异常:
mappedBy引用未知的目标实体属性: IncludedSite.ctas中的CtaContractBase.includedSite
另一个解决方案似乎是用@MappedSuperClass替换SCContract中的@Entity注释,但这会导致另一个例外(使用@OneToMany或@ManyToMany定位未映射的类:StudyContract.contracts [SCContract])因为在另一个类中(StudyContract)我有
@OneToMany(fetch = FetchType.LAZY, mappedBy = "studyContract", targetEntity = SCContract.class)
@BatchSize(size = 10)
private Set<SCContract> contracts;
并且博客解释说使用这种方法不再可能有超类的集合。
还有其他解决方法或我遗失了什么吗?
答案 0 :(得分:1)
IncludedSite
中的关联定义为
@OneToMany(fetch=FetchType.LAZY, mappedBy = "includedSite")
private Set<CtaContractBase> ctas = new HashSet<CtaContractBase>();
因此,Hibernate在类IncludedSite
中查找名为includedSite
的{{1}}类型的属性。没有这样的领域。该字段仅存在于子类CtaContractBase
中。这意味着只有SCContract
个实例可以成为此关联的目标,因此关联应该定义为
SCContract