Play Framework 2.3 For Java ことはじめ #6 データベース接続(JPA with Hibernate)編
Play Framework 2.3 For Java 入門記事一覧
ほんとはデータベース編はSpring Data JPA編で終わりにしようと思ってたんだけど、謎が残ってるから、やっぱり第6回は、JPA with Hibernateもやってみなきゃよく分からんということでやってみます。公式チュートリアルのJPAのところです。
1. activatorを使って用意されてるtemplateからアプリケーション作成
今回はもとに戻ってplay-java
のテンプレートからJPA with Hibernateで動くところまでもっていきます。
activatorでjpa-hibernate-sample
って名前のアプリケーション作って、Eclipseで開けるようにする。テンプレートはplay-java
$ activator new jpa-hibernate-sample play-java $ activator eclipse
2. 設定ファイルにpostgreSQLの設定を入れていく
何回もやってるのでだんだん慣れてきた。
まずはbuild.sbt
に依存関係追加。javaEbean
は消して以下を追加。
javaJpa, "org.hibernate" % "hibernate-entitymanager" % "3.6.9.Final", "org.postgresql" % "postgresql" % "9.3-1101-jdbc41",
次にapplication.conf
にDBの設定。jndiName
というのは、JPA使うときは必要みたい。jpa.default
はこのあと新しく作るpersistence.xml
に対応しているようだ。
db.default.driver=org.postgresql.Driver db.default.url="jdbc:postgresql://127.0.0.1/sample" db.default.user=test db.default.password="password" db.default.jndiName=DefaultDS jpa.default=defaultPersistenceUnit
次にpersistence.xml
を新しく追加します。場所はconf/META-INF/persistence.xml
です。これはPlayだとこの場所って決まってるのかな。多分Hibernateの設定ファイルみたいなものなんだろう。さっきのjpa.default
で設定したやつはここのpersistence-unit
を指定してます。
<persistence 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_2_0.xsd" version="2.0"> <persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <non-jta-data-source>DefaultDS</non-jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> </properties> </persistence-unit> </persistence>
3. モデルとなるクラスを作成する
idと適当な名前とEmailを持っているPerson
クラスを作成します。app/models/Person.java
として作成。
@Entity public class Person { @Id @GeneratedValue public Long id; public String name; public String email; }
4. この状態でEvolutionが走るかアプリケーションを実行してみる
結果、Evolutionは走りませんでした。EBeanだったら自動的にスクリプト作られるんだけどな。で、自分で、conf/evolutions/default/1.sql
を作ってddlを書いてもう一回起動し直してアクセスしたら、Evolutionが走った。これでついにEvolutionの謎がとけた。
ということですね。今回はpersistence.xml
でhibernate.hbm2ddl.auto
を書いてないのでハイバネート様による神の力も発動されませんでした。
5. データの取得と取得処理を書く
Application.javaのindexメソッドにこんな感じで書く。JPAというヘルパーメソッドを取得してアクセスするって感じで、さっきのSpring Data JPAのリポジトリパターンとはちょっと違う感じ?
Person person = new Person(); person.name = "hoge"; person.email = "hoge@example.com"; JPA.em().persist(person); Person firstPerson = JPA.em().find(Person.class, 1L); System.out.pringln(firstPerson.id + ":" + firstPerson.name + ":" + firstPerson.email);
で、これで実行してみると、テーブルは作成されたんですが、
hibernete_sequence
がデータベースにないって怒られます。
どうやら、Person.java
で、@Id
、@GeneratedValue
を設定しておくと、postgreSQLの場合は、hibernate_sequence
がある前提で話が進むようです。
なので、データベース上で以下のSQLを発行してあげるとエラーがなくなってうごきました。
CREATE SEQUENCE hibernate_sequence;
まとめ
JPA with hibernateをやることで、EBeanとのEvolutionの挙動の違い、postgresqlにおけるsequenceのことが分かりました。これでやっとスタートラインにたてたって感じですね。
データベースまわりの設定はだいたい分かってきたので、第7回は、cssやjsなどの組み合わせ方をみていきます。 第7回はこちら -> Play Framework 2.3 For Java ことはじめ #7 bootstrap3を使う