-1

私はすでに成長しているプロジェクトで作業しているので、使用されているフレームワークやライブラリのバージョンを変更することはできません。

実際、私は2つのエンティティと、、およびで解決できた特定の状況が@Inheritanceあり@DiscriminatorColumnまし@DiscriminatorValueた。これで、次のように、継承内の両方のクラスへの参照を持つエンティティができました。

@Entity
//Other annotations
public class A implements IA {
    //Class body
}

@Entity
//Other annotations
public class B extends A implements IB { //Note: `IB` extends `IA`.
    //Class body
}

@Entity
//Other annotations
public class Container {
    private IA object1;
    private IA object2;
}

ここでの問題は、@ Anyアノテーションを使用しようとしていることです。これは、object1および/またはのいずれかがまたobject2はのタイプである可能性があるためです。私がやったことはこれです:AB

@Any(metaColumn=@Column(name="objectOneType", length=3),fetch=FetchType.EAGER)
@AnyMetaDef(idType="long",metaType="string", metaValues={
        @MetaValue(targetEntity=A.class, value="A"),
        @MetaValue(targetEntity=B.class, value="B")
    }
)
@JoinColumn(name = "relatedObjectId")
private IA object1;

ここで述べたように、Hibernateの@AnyアノテーションファミリーにはJPA 2に対応するものがなく、Hibernate 4.1に切り替えることができないため、Hibernateを機能させる方法や、修正するために何をすべきかを考えようとしています。

「それほどエレガントではない」方法は、新しいエンティティを作成し、フィールドをAからBにコピーして、継承を消去し、特定のケースを修正することです。

たぶん、私はまだ知らないJPAの特定の機能を失っているので、私は現在、正しい方向を示す可能性のあるあらゆる種類の提案を受け入れ、感謝しています。

4

1 に答える 1

2

@Any注釈は必要ありません。BはAを拡張するので、BisはAです。したがって、以下で十分です。

public class Container {
    @ManyToOne
    private A object1;

    @ManyToOne
    private A object2;
}

(関連付けがManyToOneであると想定します。OneToOneの場合もあります)

Hibernateは、両方のオブジェクトの具体的なタイプをすべてそれ自体で把握し、object1とobject2をAまたはBのインスタンスで初期化します。

于 2012-11-23T18:12:03.927 に答える