2007-09-01

すぐに始める Spring + OpenJPA 1.0.0

クラスパスに追加したもの

commons-collections-3.2.jar
commons-lang-2.2.jar
commons-logging-1.0.4.jar
openjpa-1.0.0.jar
geronimo-jpa_3.0_spec-1.0.jar
geronimo-jta_1.1_spec-1.1.jar
serp-1.13.1.jar

他にも要るかもしれないが、なんにせよ OpenJPAの配布物に含まれている。
あれ、0.9.7の時はgeronimo-j2ee-connectorも必要だったような気が・・・まあいいか。

Java VMに与えたオプション

-javaagent:path/to/openjpa-1.0.0.jar

Eclipseの場合は Run.. から Arguments → VM arguments: に書く。

このオプションを与えることによって、永続クラスをOpenJPA用にエンハンスする処理が自動で行われる。
(Hibernate-JPAの時は何もしなくても勝手にやってくれていた気がする)
他にも、classファイルを静的にエンハンスする方法(ビルドタイムエンハンス)などがある。

Springの Bean定義ファイルに追加したもの

(dataSourceの定義は既にあるものとする)

<bean id="entityManagerFactory"
class=
"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"/>
</property>
</bean>

(0.9.7の時にはつけていたかもしれない)loadTimeWeaverプロパティは、1.0.0ではつけないこと。さもないとランタイムエンハンスに失敗する?

クラスパス以下に作成したファイル

META-INF/persistence.xml

<?xml version="1.0"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="適当な名前" transaction-type="RESOURCE_LOCAL"/>
</persistence>

JPAの入門記事などでは、persistence.xml内にデータソースなど様々な設定を書き込むように解説されているのが普通だが、Spring LocalContainerEntityManagerFactoryBeanを使って EntityManagerFactoryを定義する場合にはそうする必要がない。
但し、永続クラスのリストをpersistence-unit要素内に持たないと OpenJPAのランタイムエンハンサが全てのクラスをエンハンス対象かどうか調べなければならないためクラスのロードがやたらと遅くなるので、上記の例では省略しているものの必要な永続クラスの数分だけ class 要素を並べるのだけはやっておいた方がよい。

JPAを使用するコードの例

EntityManager em = entityManagerFactory.createEntityManager();
// 主キー指定でDBから行をフェッチし、MyEntityのインスタンスとして得る
MyEntity e = em.find(MyEntity.class, 123);
// ...など、いろいろ処理
em.close(); // 使い終わったら片付ける
MyEntityはDBのテーブルに対応づけられるべくアノテーション漬けにされた永続クラス。

その他

永続クラスのキーになるクラスは、下記の条件を満たしていないとOpenJPAでは使えないことに注意。

equals()が実装されている
hashCode()が実装されている

永続クラス本体側では、キーとなるフィールドに@Idアノテーションが付いていること。

RDBMSの種類は設定で教えてあげなくてもドライバの種類を見て勝手に判断するようだ(少なくとも PostgreSQLではそうだった)

ラベル: ,

0 件のコメント:

コメントを投稿

<< ホーム