NetBeans6.8 BetaでJPA2.0を試してみる。 - その3

さて、いよいよMetamodelの作成。
Metamodelにいろいろある仕様を簡単に列挙してみます。

  • entityというパッケージにあるCustomerというエンティティクラス*1に対するMetamodelのクラスはentityパッケージ内にCustomer_というクラス名で作成される*2
  • Metamodelクラスのクラス名は対象となるエンティティクラスのクラス名の後ろに"_"を付けたものになる*3
  • Metamodelクラスにはjavax.persistence.StaticMtamodelアノテーションを付けなければならない。
  • もしHogeというエンティティクラスがFooというクラスを継承(つまり@MappedSuperclassアノテーション等の付与されたクラスを継承)している場合、そのエンティティクラス(Hoge)に対するMetamodelクラス(Hoge_)はFoo_というFooエンティティクラスに対するMetamodelクラスを継承していなければならない。
  • Fooというエンティティクラスに定義されてある非コレクション型の永続化対象フィールドは下記のようにMetamodelクラスに定義されなければならない。
//Barという型であるbarというフィールドがFooクラスに定義されている場合
public static volatile SingularAttribute<Foo,Bar> bar;
  • コレクション型の永続化対象フィールドがエンティティクラスに定義されてあった場合は下記のように定義されなければならない。
//対象となるフィールドの型がjava.util.Collectionの場合
public static volatile CollectionAttribute<Foo,Bar> bars;

//対象となるフィールドの型がjava.util.Listの場合
public static volatile ListAttribute<Foo,Bar> barLit;

//対象となるフィールドの型がjava.util.Setの場合
public static volatile SetAttribute<Foo,Bar> barSet;

//対象となるフィールドの型がjava.util.Mapの場合
public static volatile MapAttribute<Foo,Bar> barMap;


んで、上記を考慮した場合に例えば下記のようなエンティティクラスがあった場合

@Entity
@Table(name = "CUSTOMER")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "CUSTOMER_ID")
    private Integer customerId;
    @Column(name = "NAME")
    private String name;
    @Column(name = "ADDRESSLINE1")
    private String addressline1;
    @JoinColumn(name = "DISCOUNT_CODE", referencedColumnName = "DISCOUNT_CODE")
    @ManyToOne(optional = false)
    private DiscountCode discountCode;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "customerId")
    private List<PurchaseOrder> purchaseOrderList;

//アクセサは省略・・

Metamodelクラスはこんな感じになります

@StaticMetamodel(Customer.class)
public class Customer_ {
    public static volatile SingularAttribute<Customer, Integer> customerId;
    public static volatile SingularAttribute<Customer, String> name;
    public static volatile SingularAttribute<Customer, String> addressline1;
    public static volatile SingularAttribute<Customer, DiscountCode> discountCode;
    public static volatile ListAttribute<Customer, PurchaseOrder> purchaseOrderList;
}

そんなこんなで、次回はこいつを使った問い合わせ方法とかを書いていこうかなぁ〜とか考えてます。

*1:@Entityアノテーションが付いていて、JPAエンジンにより管理されるクラス

*2:例外が可能かどうか現時点で不明です。

*3:これも例外が可能かどうか不明です。