2013-01-10 9 views
7

ORMにhibernateとannotationsを使用しています。 すべてのBeanのインタフェースがあり、リレーションシップにtargetEntityを使用しています。 getterがBeanではなくインタフェースを返すため、hibernateは型を派生できません。@ManyToOneをオーバーライドする@Embedded for interfaces with

埋め込み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; 
    } 

} 

IはMappingExceptionを得る:表で、フィールド:の型を判別できませんでした列のチャート:[org.hibernate.mapping.Column(フィールド)]

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

誰かが正しい方向に向いていますか?

答えて

0

私の過去の使用は私に、継承を使わないように言った。マッピングされたスーパークラス、インタフェースなどはありません。単にメンバを持つエンティティです。私はeclipselinkと同様に休止状態で働いていて、両方とも本当に相続に問題があります。これらのプロバイダすべてに非常に多くのバグが存在するため、複数のプロバイダをサポートするjpaを使用した永続化レイヤを作成することは非常に難しいです。できるだけシンプルにしてください。 「特別な」機能を使用しないでください。プロバイダを変更しようとしたり、jboss(hibernate)やglassfish/weblogic(eclipse/top link)などの異なるアプリケーションサーバ上でソフトウェアを実行しているときは、最も単純な永続性レイヤを使用して可能な限り機能します。これがバグかどうかは分かりませんが、私はそれが正しいと思います。

+0

私はインターフェイスを使用していますおよび相続。これがORMのレベルでいくらか複雑さをもたらしたと認めている。一方、それは私が探している抽象化のレベルを私に提供する。 – user1966634

+0

**インタフェース**は、ORMテクノロジの抽象化を提供するために使用されます。 MDAアプローチを使用して、インタフェース、Bean、サービスクラスなどのオブジェクトモデルから永続化レイヤーコードを生成します。代替のORM技術は、インターフェイスを安定に保ちながら代替のBeanとサービスクラスを生成することで、透過的に使用できます。 – user1966634

+0

**継承**は、データモデリングの観点から、データの一般的なビューと特定のビューの両方をサポートする必要があります(特に、排他的ではありません)。いくつかの欠点にもかかわらず、この機能は依然として有用であり、アプリケーションスタック内のより高いレベルでコードを単純化します。 – user1966634

1

これまでしばらくの間、私は実用的な解決法を使用しましたが、ベンダーロックインの軽微なケースが含まれています。私はJPAの注釈だけでこれを行う方法は見つけられませんでしたが、トリックを行うHibernate固有の注釈@Targetがあります。あなたのような何かを期待通りの結果で遂げました。しかし、私はあなたの他の注釈を使用しなかったので、期待通りに動作することを保証するものではありません。

組み込みクラスで起こっている奇妙な何も:

public interface PointsInt extends Serializable { 
    int offensivePoints(); 

    int defensivePoints(); 

} 

@Embeddable 
public class Points implements PointsInt { 
    private int def; 
    private int off; 
    public int offensivePoints() { return off; } 

    public int defensivePoints() { return def; } 

} 

しかし、消費クラスで、私たちはHibernateの@Targetを使用します。

import javax.persistence.*; 
import org.hibernate.annotations.Target; 

@Entity 
public class Series extends LongIdEntity implements Serializable { 

    @Embedded 
    @Target(Points.class) 
    private PointsInt points; 
    // I prefer to declare my annotations on fields rather than methods 
} 

結果:

mysql> describe series; 
+-----------------+-------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+-----------------+-------------+------+-----+---------+----------------+ 
| id    | bigint(20) | NO | PRI | NULL | auto_increment | 
| def    | int(11)  | YES |  | NULL |    | 
| off    | int(11)  | YES |  | NULL |    | 
+-----------------+-------------+------+-----+---------+----------------+ 
3 rows in set (0.12 sec)