双方向の一対多の関係をマッピングしようとしています。「多」側が抽象スーパークラスを参照しているため、問題が発生しています。考えられる原因をインターネットで検索しているときに、これが既知の問題であることを発見しましたが、私の場合の解決策を見つけることができませんでした.
このブログで回避策を確認しました。「単一のテーブル、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
別の解決策は、SCContract の @Entity アノテーションを @MappedSuperClass に置き換えることですが、これにより別の例外が発生します (マップされていないクラスをターゲットとする @OneToMany または @ManyToMany の使用: StudyContract.contracts[SCContract])。
@OneToMany(fetch = FetchType.LAZY, mappedBy = "studyContract", targetEntity = SCContract.class)
@BatchSize(size = 10)
private Set<SCContract> contracts;
ブログで説明されているように、このアプローチを使用してスーパークラスのコレクションを持つことはもはや不可能です。
他の回避策はありますか、それとも何か不足していますか?