まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

Play Framework 2.3 For Java ことはじめ #6 データベース接続(JPA with Hibernate)編

f:id:masato47744:20140720125846p:plainPlay 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の謎がとけた。

  • EBean: ddlを書かなくても自動で生成される。もちろんEvolutionも実行される。
  • JPA: ddlは自動では生成されない。しかし、自分で書いておけばEvolutionは実行される。

ということですね。今回はpersistence.xmlhibernate.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を使う