毛嫌いされる今だからこそ、Java！ --- JPA編 ----

# なぜ、今、Javaなのか。
だって、Javaって、すごく嫌われてるから。こんなに嫌われてると、そばに居てあげたくなるじゃないですか。

# ということで、あらためて、JPAのおさらいをしてみましょう。
JPA、知っていますか？JavaのObject-Relation-Mapper、簡単にデータベースに接続する規格、仕組みですね。
ここでは、Githubに載せたサンプルコードの解説をすることでJPAの使い方をおさらいしてみます。

# 使うもの
JPAは規格で、その規格に則って作られているアプリケーションはいくつかあります。今回は[EclipseLink](https://www.eclipse.org/eclipselink/ "EclipseLink")を使います。
また、DBには簡単に使えてサンプルコードに同梱できる[H2](http://www.h2database.com/html/main.html "H2")を使います。EclipseLink自体は[たくさんのDB](http://wiki.eclipse.org/EclipseLink/FAQ/JPA#What_databases_are_supported.3F)に対応しているので、他のDBを使いたい方は読み替えて下さい。
あと、J2EEアプリケーションサーバはは使いません。ただのJava（J2SE）で動かします。そのほうがテスト性がいいですからね。
開発環境にはEclipseを使います。

まとめると、使うものは、

* EclipseLink
* H2
* Java
* Eclipse

です。EclipseLinkとH2はサンプルに同梱されているので、セットアップの必要はありません。

# サンプルを動かしてみる。
Githubに[サンプル](https://github.com/ukiuni/EclipseLinkInspect)を置きました。
動かしたい場合は、Eclipseで落として、プロジェクトとしてインポートして下さい。インポート手順は[こちら](http://eclipse-egit.blogspot.jp/2013/08/gitgit-clone.html)を参考にしてください。

# サンプルの説明
## 必要なJar
最小限でEclipseLinkを動かすために必要なJarファイルは、[ここ](https://github.com/ukiuni/EclipseLinkInspect/tree/master/libs)にある、
eclipselink.jarとjavax.persistence_2.1.0.v201304241213.jarです。サンプルではH2を使うので、h2-1.4.178.jarも入れてあります。

## 設定ファイル([persistence.xml](https://github.com/ukiuni/EclipseLinkInspect/blob/master/src/META-INF/persistence.xml))
DBへの接続情報をXMLで記述します。
動作環境により設定すべきはL9〜L12のDBへの接続情報のみです。あとはそのまま使えます。

```xml:persistence.xml（抜粋）
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:file:./db/myH2.db" />
<property name="javax.persistence.jdbc.user" value="test" />
<property name="javax.persistence.jdbc.password" value="test" />
```

persistence.xmlは、ClassPathが通ったフォルダやJarファイル内のMETA-INFフォルダに配置する必要があります。
これだけで設定完了。簡単ですね。

# ソース
[MyEntityクラス](https://github.com/ukiuni/EclipseLinkInspect/blob/master/src/org/ukiuni/jpaInspect/entity/MyEntity.java)が、DBのテーブルとマッピングされるクラスです。@Entityをクラスのアノテーションに付与すれば、DBとマッピングされます。簡単。

[Mainクラス](https://github.com/ukiuni/EclipseLinkInspect/blob/master/src/org/ukiuni/jpaInspect/Main.java)でDBへのinsertとselectを行っています。

insertは簡単。オブジェクトを作って、入れるだけです。

```java:Mainクラス（insert抜粋）
System.out.println("insert start");
em.getTransaction().begin();
MyEntity myEntity = new MyEntity();
myEntity.setText("This is a Test text");
myEntity.setCreatedAt(new Date());
em.persist(myEntity);
em.getTransaction().commit();
System.out.println("insert end generated id = " + myEntity.getId());
```

これだけで、insertがされます。
ところで、不思議な事にDDL、create文は発行てないのに、insertができちゃいますよね！？そうなのです。EclipseLinkが自動で作ってくれるのです！強力！JPA！

対してselect文は少し複雑です。

```java:Mainクラス（select抜粋）
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb.createQuery(MyEntity.class);
Root<MyEntity> r = cq.from(MyEntity.class);
List<MyEntity> myEntities = em.createQuery(cq.select(r)).getResultList();
for (MyEntity myEntity : myEntities) {
	System.out.println(myEntity.getId() + ":" + myEntity.getText() + ":" + new SimpleDateFormat("mm ss").format(myEntity.getCreatedAt()));
}
```

ここではCriteriaという仕組みでSelect文を発行しています。タイプセーフに行うためにはCriteriaを使うのが良いです。勿論、生のSQLも発行できますが、それは別の機会に。

# どうだ！嫌われても強力だ！Java！JPA!
え？ActiveRecordだともっとシンプルにパワフル？まぁまぁ。Javaの最大の強みは静的型付けです。いいじゃない！お硬くても！貞操を守りぬくのですよ！

今回の寄り添いはここまで。