2011-11-08 10 views
1

私は、外部クラスの複雑なプロパティを表現するために埋め込み可能な内部クラスを使用しようとしています。これを保存すると、eclipselinkによって生成されたデータベーススキーマ内の内部クラスからの情報はありません。JPAで複雑な状態を表すためにネストされたクラスを埋め込む

私がしようとしていることは良い考えのようですか? eclipselinkが@Basicの属性をgetRate()に認識しているように見えるのはなぜですか?Attributes

その他の情報:Measureは、Personのコンストラクタに提供されているファクトリを使用してインスタンス化する必要があります。したがって、私はこれをどのように使用できるようになるか分かりません。 Personの状態を単純な言葉で(ダブルスのように、Measuresではなく)保存する別のクラスを作る必要があるように思えますが、それを使って実際のPerson型オブジェクトを作成しますが、それは非常に悲しい私の残りのアプリケーションには意味があります。

@Entity 
    public static class Person { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    @Transient 
    public Measure<Double, CleanupRate> rate; 
    @Embedded 
    private Attributes attributes; 

    @Embeddable 
    public static class Attributes { 

     @Transient 
     private Person person; 

     public Attributes() { 

     } 

     public Attributes(Person person) { 
     this.person = person; 
     } 

     @Basic 
     public double getRate() { 
     return person.rate.getInternalValue(); 
     } 

     public void setRate(double value) { 
     person.rate.setInternalValue(value); 
     } 
    } 

    public Person() { 
     rate = udm.getMeasureFactory().createMeasure(0.0, CleanupRate.class); 
     attributes = new Attributes(this); 
    } 

    public void setRate(double rate) { 
     this.rate.setValue(rate); 
    } 
    } 

編集:

それらはストレージから取得されたときに、私のオブジェクトに対策依存性を注入するために、私は、依存関係を注入し、私のDAOでそれを使用するインタフェースを追加しました。 DAOを注入できるので、依存関係を検索されたオブジェクトに伝播できます。私はblogからアイデアを得ました。

private <T extends UomInjectable> List<T> // 
      getListOfUomInjectableType(final Class<T> klass) { 
    List<T> result = getListOfType(klass); 
    for (UomInjectable injectable : result) { 
     injectable.injectUomFactory(udm); 
    } 
    return result; 
    } 

答えて

2

Personクラスのアクセスタイプを使用しています。これはフィールドに設定されているため、プロパティレベルで注釈が表示されません。

埋め込み可能クラスのアクセス(PROPERTY)を使用してアクセスタイプを変更する必要があります。また、person属性の@Transientアノテーションを削除する必要があります。

2

一般的には、引数を持つコンストラクタを必要とするエンティティ(埋め込み型またはその他の)を持つことに問題があると思います。私はそれがあなたのスキーマ生成の問題にどのように関係するかもしれないか分かりませんが、これはこれらのオブジェクトを永続化/取得しようとすると問題になると思います。

JPAでは、すべてのエンティティタイプに引数のないコンストラクタが必要です。 Attributesクラスには属性がありますが、 'person'フィールドはnullになっています。このフィールドはNPEの結果としてかなり速くなります。 Personコンストラクタと同じです(おそらく、サンプルコードから 'udm'で渡されたものを省略したでしょうか?)。

+0

はい、これは、ユニットテストの内部だけでテストコード(人が静的である理由です)です。 – Dave

+0

私は、属性オブジェクトから値を読み取る 'Person'の中で' @ PostLoad'メソッドを使うことで、属性の中の 'Person'への参照を回避することができました。私がシングルトンに頼らずに 'Measure'オブジェクトをどのようにインスタンス化するのかについてはまだ考えています。 – Dave

関連する問題