0

双方向の一対多の関係をマッピングしようとしています。「多」側が抽象スーパークラスを参照しているため、問題が発生しています。考えられる原因をインターネットで検索しているときに、これが既知の問題であることを発見しましたが、私の場合の解決策を見つけることができませんでした.

このブログで回避策を確認しました。「単一のテーブル、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;

ブログで説明されているように、このアプローチを使用してスーパークラスのコレクションを持つことはもはや不可能です。

他の回避策はありますか、それとも何か不足していますか?

4

1 に答える 1

1

の関連付けIncludedSiteは次のように定義されます。

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

そのため、Hibernate はclass でIncludedSite指定されたタイプの属性を探します。そのようなフィールドはありません。フィールドはサブクラスにのみ存在します。これは、インスタンスのみがこの関連付けのターゲットになることができることを意味し、関連付けは次のように定義する必要があります。includedSiteCtaContractBaseSCContractSCContract

@OneToMany(fetch=FetchType.LAZY, mappedBy = "includedSite")
private Set<SCContract> ctas = new HashSet<SCContract>();
于 2013-01-03T11:48:52.983 に答える