2011-08-16 8 views
8

私は永続オブジェクト(Action)と自動生成データモデル(Action_)を持っています。 ActionクラスのオブジェクトとSingularAttributeのインスタンスを持つことで、与えられたSingularAttributeに対応するフィールドを取得することは可能ですか?永続オブジェクトのSingularAttributeマップされた値を取得する方法は?

public S getValue(T object,SingularAttribute<T,S> attribute); 

私のエンティティクラス(Action.java):

@Entity 
@Table(name="ACTION") 
public class Action implements Serializable { 
    private long id; 
    private String name; 

    public Action() { 
    } 


    @Id 
    @Column(unique=true, nullable=false, precision=6) 
    public long getId() { 
     return this.id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 


    @Column(length=50) 
    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

私のメタモデルクラス(Action_.java):

@StaticMetamodel(Action.class) 
public class Action_ { 
    public static volatile SingularAttribute<Action, Long> id; 
    public static volatile SingularAttribute<Action, String> name; 
} 
+0

JPAは、オブジェクトのフィールドの値を提供することがない、それは/永続オブジェクトを取得することです。返信が示すように、Javaのリフレクションを使用します。 – DataNucleus

答えて

4

は、私はこのような機能を必要とします

getJavaMember()メソッドを使用してメンバーを取得し、このメンバーがFieldまたはであるかどうかをテストできますを呼び出し、フィールドにアクセスするか、リフレクションを使用してオブジェクトのメソッドを呼び出します。

アクセスする前にフィールドまたはメソッドをアクセス可能にする必要があります。また、オブジェクトへのプリミティブ型の変換も処理する必要があります。

主な質問は、なぜこれが必要なのですか?

あなただけのこの特定のエンティティクラスのためにそれが必要な場合は、単に属性名でスイッチを使用して、適切な値を返すことができます:JB NizetあなたはgetJavaMemberを使用することができ、示唆したように

switch (attribute.getName()) { 

    case "name": 
     return action.getName(); 
    ... 
} 
+0

あなたの迅速な対応に感謝します。私は(メタモデルを使用して)任意の永続オブジェクトで動作できるはずの一般的なクラスを作りたいと思います。たとえば、データベースのテーブルを表すクラスです。 getJavaMember()関数を使用するのは唯一の方法だと思われますが、すべての永続オブジェクトがフィールドのgetterメソッドを提供する必要があるため、APIはすべてのフィールドを取得する機能を提供することを期待しています(必要に応じて内部的にgetterメソッドを使用します)。 –

+0

それは動作します。私がSingularAttributeが@Columnが設定されている場所に基づいてメソッドまたはフィールドのインスタンスを返すことを期待していました。再度、感謝します! –

8

を。私は、プライベートフィールドをアクセス可能に設定する必要はないことを発見しました。おそらく、Hibernateは既にこれを行っています。これが役に立つ場合

は、ここに私の作品にいくつかのコードです:

/** 
* Fetches the value of the given SingularAttribute on the given 
* entity. 
* 
* @see http://stackoverflow.com/questions/7077464/how-to-get-singularattribute-mapped-value-of-a-persistent-object 
*/ 
@SuppressWarnings("unchecked") 
public static <EntityType,FieldType> FieldType getValue(EntityType entity, SingularAttribute<EntityType, FieldType> field) { 
    try { 
     Member member = field.getJavaMember(); 
     if (member instanceof Method) { 
      // this should be a getter method: 
      return (FieldType) ((Method)member).invoke(entity); 
     } else if (member instanceof Field) { 
      return (FieldType) ((Field)member).get(entity); 
     } else { 
      throw new IllegalArgumentException("Unexpected java member type. Expecting method or field, found: " + member); 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 
+0

良い解決策。 EntityAttributeCollectionを簡単に導出して、既存のコレクション内のエンティティの属性を反復処理できるようにしました。 – mazatwork

+0

これは素晴らしいです!たくさんのコードを追加することなく、JSFで簡単に新しい列を作成できます。 – alexander

関連する問題