2012-09-27 13 views
11

私は、次のエンティティを持っている:インタフェース属性を持つJPAエンティティは可能ですか?

@Entity 
public class TestCaseStep implements JPAEntity<Integer> { 

     ... 

    @Column(name="STEP_NUMBER") 
    private Integer stepNumber; 

    @Enumerated(EnumType.STRING) 
    @Column(name="ACTION") 
    private Action action; 

    **@ManyToOne 
    @JoinColumn(name="connector") 
    private ScriptItem connector;** 

私の属性ScriptItemは3つの他のクラスのためのインタフェースです。実行時の実行で正しいクラスIDを設定するようにJPAを設定することは可能ですか?

その他のリソース:注釈は、私はJAPは、私は3つのクラスの1のIDを保存することを理解させるために使用する必要があります

public interface ScriptItem { 

    String getValue(); 
    ScriptItemType getType(); 
} 

@Entity 
@Table(name="DAT_FEED_XML") 
public class FeedXml implements JPAEntity<Integer>, ScriptItem { 
    ... 
} 

@Entity 
@Table(name="DAT_DB_STMT") 
public class DbStatement implements JPAEntity<Integer>, ScriptItem { 
     ... 
} 

?事前に

おかげで、

+1

はい、しかし、scriptitemの3つの実装は、共通のスーパークラスEntityから継承する必要があります。共通のインタフェースだけではありません。(マップされたプロパティの参照型は、引き続きインターフェイスの型になります) – Affe

答えて

7

本当に良いアイデアですが、残念ながらエンティティ属性としてインターフェイスを直接マッピングすることは、JPAではサポートされていません。

@Entityで直接注釈付けされたトップレベルクラスのみをマップできます。このトップレベルのクラスは、しかし、インターフェイスを実装することがあります。

この機能が要求されており、長年にわたってdiscussedが要求されています。

thisthisもご覧ください。

達成しようとしている内容に応じて、@Inheritanceアノテーションはクラスごとのテーブルを使用することができます。

私はそれが役に立ちそうです。

0

あなたが好むどんな戦略(see the docs)を使用して、JPAで正しくセットアップにScriptItemのあなたの継承を必要として、JPAはそれについてスマートになります。

0

いいえ、JPAまたはHibernateでは不可能です。

属性をインターフェイスにするJava言語でコーディングすると、Java用のJPAなどの永続標準がインターフェイスである永続属性をサポートしないというのは奇妙に思えます。

私のORMはそれがそれを持続可能性だけよう私の「純粋な」OOモデルをリファクタリングする私を強制するとき、私はいつもそれは本当に非常にイライラました。

インターフェイス属性の永続化を実装することは技術的に不可能ではありません。実際、JDOは永遠にインターフェイスの永続性をサポートしています。これは何年も前に自分のプロジェクトすべてで使用し始めた理由です。

私はJPAへの切り替えに誘惑されました。技術的に優れているわけではなく(実際は全く反対ですが)、単に「群衆の精神」のためです。

最近の契約作業では、JPA/Hibernateでの経験を積んだり、JDO/DataNucleusと比較して多くの制限と非効率性を生かせました。

関連する問題