JPAは、ほとんど触ったことが無い。
ということで触ってみようと思う。
とりあえず、基本をやるときはコンソールアプリケーションからと決めてるわけじゃないけど、とっつきやすさからコンソールアプリケーションのプロジェクトを作る。
プロジェクト名はjpaeduにしておいた。
ソースフォルダにjpaedu.entitiesというパッケージを作って、そこにエンテティクラスを作っていこうと思う。
さて、とりあえずライブラリが無いと始まらないというわけで、ライブラリにTopLink Essentialsを追加する。JDBCドライバも無いといけないので、Java DBドライバを追加する。
データベースも無いと始まらないので、JavaDBを起動してjpaeduという名前のDBを作っておく。
次に、新規作成から持続性の持続性ユニットをさくっと作る。
これで、META-INFにpersistence.xmlが作られる。中身を見てみるとJDBCでの接続のときに使うパラメータと同じものがばっちり書き込まれてる。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="jpaeduPU" transaction-type="RESOURCE_LOCAL">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<properties>
<property name="toplink.jdbc.user" value="jpaedu"/>
<property name="toplink.jdbc.password" value="jpaedu"/>
<property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/jpaedu"/>
<property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="toplink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
この例では、jpaeduPUっていうのが持続性ユニットの名前なので覚えておこう。
次に新規作成から持続性のエンテティクラスを選択する。
クラス名にEmployeesと入力して、主キー型はデフォルトのLongのまま決定。
そうるすと下のようなコードが出力される。
@Entity
public class Employees implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
public void setId(Long id) {
this.id = id;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
// 以下 hashcodeやequalsやtoString
}
お手本みたいなJavaBeansだ。
とりあえず、入門なのでnameプロパティくらいを追加するくらいに留めておいた。
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
そしてmainに処理を書いていく。
JPAは、とりあえずEntityManagerというのがコアになるみたいだ。
こいつに対してクエリを投げると、データのつまったBeanが返ってくるという寸法になっているみたい。
とりあえずさくっと一件データを登録して全件表示するプログラムを書いてみた。
// エンテティマネージャの作成
EntityManagerFactory f = Persistence.createEntityManagerFactory("jpaeduPU");
EntityManager em = f.createEntityManager();
// トランザクションの開始
em.getTransaction().begin();
try {
// データの追加
Employees e1 = new Employees();
e1.setName("もへんじょ だろ");
em.persist(e1);
// 全データを取得してnameを印字
Collection<Employees> emps = em.createQuery("select e from Employees e").getResultList();
for (Employees emp : emps) {
System.out.println(emp.getName());
}
// 一応コミット
em.getTransaction().commit();
} finally {
// 後始末
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
em.close();
}
実行すると、ばっちりデータが登録されて、名前が列挙される。
DBはどうしたの?と思われるかもしれないけど、これはpersistence.xmlにあるように実行時に作ってるみたい。
因みに、idは自動生成するよういしてるけど、Derby(Java DB)にはシーケンスというものがなさそう。
どうやってるのかな?と思ったら下のようなテーブルを用意して管理してみるみたい。
CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL, PRIMARY KEY (SEQ_NAME))
シーケンスをサポートしてるDBでは、きっとちゃんと組み込みの機能を使ってるんだろうな~と思いつつ、今日は眠いのでここまで。