Book: Java Persistence API

*2006/11/4のKBlogからの転記

Java EE 5, GlassFish(SJS Application Server 9.xPE), NetBeans 5.5の組み合わせは、非常にパワフルです。個人が全体を把握するのはかなり困難な量になってきていますが、まずは、Persistence APIを見てみます。

Database
データベースは、以下のような単純なテーブルを使用します。
今回は、GlassFishに付属してくるDerbyを使ってみました。
NetBeansからだと非常にスムーズに使えますが、単独だと、CUI(ij)が私にとって使いづらいです。

create table book (
    bookid      int                 primary key,
    title       varchar( 255 )      not null,
    price       int
);
Entity (Annotated POJO) データベースに対応するエンティティクラスを定義します。 アノテーションが指定されたPOJOです。 javax.persistence.* は、GlassFishやJavaEE5 SDKのjavaee.jar含まれています。 以下はストレートなマッピングで、コードは理解しやすく、コンセプトも明確なので、開発者は特別なハーネス無しに作成できそうです。テーブルが複数ありリレーションシップを定義しなければならなくなると、もっと研究が必要になると思われます。
package testpersistence;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "BOOK")

public class Book implements Serializable {

    @Id
    @Column(name = "BOOKID", nullable = false)
    private Integer bookid;

    @Column(name = "TITLE", nullable = false)
    private String title;

    @Column(name = "PRICE")
    private Integer price;
    
    ...以下 getter,setter ...
} 
persistence.xml EntityManagerが使用するPersisntece定義ファイルを作成します。 テンプレートやハーネス無しには作成が難しそうです。 NetBeans のWizardで作成しました。NetBeans および GlassFishにはOracleのTopLink Essential(おそらく元WebGainから買収した製品)というO/R Mappingのためのライブラリが付属していて、デフォルトだとそれが使われます。 HibernateやKODO等、別のO/R Mappingも使用できそうなので、今後調べてみたいと思っています。 まずは、TopLinkで進めます。JDBCドライバーや接続情報などの一般的なプロパティが定義されています。 ディレクトリはMETA-INFに、ファイル名はpersistence.xmlとして作成されています。


  
    oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
    testpersistence.Book
    
      
      
      
      
      
    
  

TopLink Essensialの説明は以下を参考にしてください。 Main 以上で、下準備は完了ですので、実際に利用します。 見てのとおりなのですが、Persistenceクラスのファクトリメソッドを使って、EntityManagerFactoryインスタンスを作成します。 persistence.xml内のpersistence-unitで定義されている名前を指定し、そこから、EntityManagerインスタンスを取得します。 以下の例では、全権検索を行なうクエリをEJB QLで実行しています。
package testpersistence;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class Main {
    private static EntityManagerFactory factory = 
            Persistence.createEntityManagerFactory( "topLinkPersistence" );
    private static EntityManager manager = factory.createEntityManager();
    
    private static String TOPLINK_EJBQL = "SELECT b FROM Book b";

    public static void main(String[] args) {
        
        Query query = manager.createQuery( TOPLINK_EJBQL );
        List<Book> books = query.getResultList();
        for( Book book : books ) {
            System.out.printf( "%5s %-15s %5s", 
				book.getBookid(), 
				book.getTitle(), 
				book.getPrice() );
        }
    }
}
実行 作成された、Book.java, persistence.xml, Mail.javaを実行するために必要なパッケージは、以下のとおりです。 JDBC Driver: derbyclient.jar (from GlassFish) TopLink: toplink-essensials.jar (from GlassFish/Netbeans javax.persistence APIを含む)
# java -cp ../build/classes:/opt/glassfish/javadb/lib/derbyclient.jar:/opt/glassfish/lib/toplink-essentials.jar testpersistence.Main 1 java book 100 2 hibernate book 150 3 unix book 200 4 linux book 300 5 opteron book 120 6 intel book 150 7 windows book 160 8 netbeans book 300 9 ejb book 60 10 hibernate book 110
内部的にどのようなことが起きているのか、特にPOJOに対するAnnotationがどのように機能しているのかは研究する必要がありそうですが、少なくとも、利用する側の視点からはNetBeansと組み合わせると、非常に迅速にO/Rマッピングが可能になります。 NetBeans5.5は非常に高機能になっていて、GlassFishと組み合わせると更に様々な機能が使えるようになります。 データベースとしてDerbyがすぐに利用でき、かつ、データベースのスクリプトを.sqlという拡張子で作成しておくとNetBeansから実行できます。データベースの初期化がIDE上で行なえます。 JDBCの接続をNetBeansに登録しておくと、SQLの実行が行なえるだけでなく、Persistence Wizardで選択可能になり、対応した設定ファイルやPOJOとpersistence.xmlを作成してくれます。 参考: http://www.netbeans.org/kb/55/app-client-preview.html https://glassfish.dev.java.net/javaee5/persistence/entity-persistence-su...