2013-10-31 8 views
15

私は約2時間このコードを理解しようとしています。たとえば、以下のクラスでは、これらのフィールドは何を表していますか?@StaticMetamodelとSingularAttributeは<Obj,Obj>とは何ですか?

import java.util.Date; 
import javax.persistence.metamodel.ListAttribute; 
import javax.persistence.metamodel.SingularAttribute; 
import javax.persistence.metamodel.StaticMetamodel; 
import java.util.UUID; 

@StaticMetamodel(Address.class) 
public class Address_ extends { 
    public static volatile SingularAttribute<Address, Long> id; 
    public static volatile SingularAttribute<Address, UUID> personId; 
    public static volatile SingularAttribute<Address, Person> person; 
} 

Address.classは、次の定義が含まれたJavaクラスです:

@Entity 
@Table(name = "address", schema = "public") 
public class Address{ 
    private Long id; 
    private Person person; 
    private UUID personId; 
    //.... 
} 

あなたは、のために使用さ@StaticMetamodel@SingularAttribute注釈が何であるかを説明していただけますか?それは単純かもしれないが、私は理解できない。 documentation 1として

答えて

17

静的なメタモデルは、ドメインモデル内のエンティティ と埋込み可能「ミラー」という一連のクラスで、ミラーリングされたクラスの属性に関する メタデータへのスタティックアクセスを提供します。パッケージp内の各管理クラスXについては

  • 、パッケージpでのメタモデルクラスX_作成されます。

静的なメタモデルは、次のプロパティがあります。次のようにyのタイプはYあるクラスX、によって宣言されているすべての永続的な非コレクション値属性yについては

  • は、メタモデルクラスが宣言を含まなければならない:

    SingularAttribute例:

    public static volatile SingularAttribute<X, Y> y; 
    

    静的メタモデルは、のJPAのCriteria APIを使用してタイプセーフなクエリを作成する場合に便利です。

    @Entity 
    public class Order { 
        @Id 
        @GeneratedValue 
        Integer id; 
    
        @ManyToOne 
        Customer customer; 
    
        @OneToMany 
        Set<Item> items; 
    
        BigDecimal totalCost; 
    
        // accessors 
    } 
    

    Itemエンティティ:

    @Entity 
    public class Item { 
        @Id 
        @GeneratedValue 
        Integer id; 
    
        int quantity; 
    
        @ManyToOne 
        Order order; 
    
        // accessors 
    } 
    

    ここクライテリアAPIで構築し、タイプセーフな基準クエリです:

    例えば

    は、のは、以下の2つのエンティティ、OrderItemてみましょう

    CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Order> cq = cb.createQuery(Order.class); 
    SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items); 
    cq.where(cb.equal(itemNode.get(Item_.id), 5)).distinct(true); 
    

    Item_.idおよびOrder_.itemである。これらのアクセスはで静的にです(エンティティプロパティを反映する)静的メタモデルのプロパティで、はクエリが正しく構築されていることを確認してです。

    +0

    あなたの答えに感謝します。私はこの部分を理解することはできません 'メタデータへの静的なアクセスを提供する'私はここで何を得るのですか?なぜエンティティ自体を使用すべきではないのですか?メタモデルを使用して私は何をすることができますか? – MoienGK

    +0

    は並行性についてですか? – MoienGK

    +0

    いいえ、フィールドのメタデータを取得するためにエンティティオブジェクトをインスタンス化してはならないということです。 –

    関連する問題