9

ORMに休止状態と注釈を使用しています。すべての Bean のインターフェイスがあり、関係に targetEntity を使用しています。getter が Bean ではなくインターフェイスを返すため、hibernate は型を派生できません。

埋め込み Bean に対して MappingException (型を判別できませんでした) が発生します。

@Entity(name="FieldBean")
public class FieldBean implements Field {
    ...
}

@Embeddable
public class FacetBean implements Facet {
    ...    

    @ManyToOne(targetEntity = FieldBean.class)
    @JoinColumn(name = "field_id")
    public Field getField() {
        return field;
    }

}

@Entity(name = "Chart")
public class ChartBean implements Chart {

    @Embedded
    @AssociationOverride(
        name = "field",
        joinColumns = @JoinColumn(name = "category_facet_field_id")
    )
    public Facet getCategoryFacet() {
        return categoryFacet;
    }

}

MappingException: Could not determine type for: Field, at table: chart, for columns: [org.hibernate.mapping.Column(field)] が発生します。

プロパティと getter/setter の宣言にインターフェイスの代わりに Bean を使用すると問題は解決しますが、インターフェイスの使用に固執したいと思います。プロパティ宣言だけに Bean を使用しても問題は解決しません。

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

1

過去に jpa を使用した経験から、継承を使用しないように言われました。マップされたスーパークラス、インターフェースなどはありません...単にメンバーを持つエンティティです。私はhibernateとeclipselinkを使用しましたが、どちらも継承に本当に問題があります。これらのプロバイダーには非常に多くのバグがあるため、複数のプロバイダーをサポートする jpa を使用して永続化レイヤーを作成することは非常に困難です。できるだけシンプルにしてください。「特別な」機能は使用しないでください。プロバイダーを変更しようとしたり、jboss (hibernate) や glassfish/weblogic (eclipse/top リンク) などのさまざまなアプリケーション サーバーでソフトウェアを実行したりする場合は、ほとんど使用しない最も単純な永続レイヤーがあれば満足できることを保証します。機能を可能な限り。これがバグかどうかはわかりませんが、バグだと思います。

于 2013-01-11T17:39:36.727 に答える