Grails App Engine Plugin + Gorm JPA Pluginでリレーションを定義してみる

2019-02-21gae, Grails

Grails App Engine Plugin + Gorm JPA Plugin で、ひとまずリレーションのないドメインクラスを用意した場合の動作は確認できました。
次はリレーションを追加してみることにしました。が、うまくいかない。
とりあえず試してみたことを列挙してみる。

環境

  • grails-1.1.1
  • groovy-1.6.3
  • java-1.6.0.14
  • app-engine-plugin-0.8.3
  • gorm-jpa-0.3

まずは単純に動くところまで

Grails AppEngine PluginでJPAを使用する(成功) | ゲンゾウ用ポストイット にて、リレーションのないドメインが動くところまで。

リレーションを追加

ここからがおかしいのだろうと思う。まずは以下の2つのドメインを作成した。

  • com.sample.Book
  • com.sample.Category

コードは以下のとおり。

Book.groovy

package com.sample

import javax.persistence.*;

@Entity
class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id

    String name

    String isbn

    @ManyToOne
    Category category

    static constraints = {
        id visible: false
    }
}

Category.groovy

package com.sample

import javax.persistence.*;

@Entity
class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id

    String name

    @OneToMany
            List
    & lt; book & gt; books;
    static constraints = {
        id visible: false
    }
}

あとはcontroller、viewを作成して実行。

$ grails generate-all com.sample.Book

$ grails generate-all com.sample.Book

$ grails clean;grails app-engine

一応画面は起動してくる。

まずはCategoryControllerを起動してみる。

なんだかわからないが、一度戻って再度起動してみる。すると。

よく分からないが起動できるようになった。新規登録してみる。


登録はできるのだが、肝心のBook情報がひもづけられない。こちらは諦めてトップ画面からBookControllerを呼び出してみる。

すでに一度ぐらいのエラーじゃ動じない。一度戻って再実行する。

新規登録してみる


画面からは先ほど登録したcategoryが選択可能になっている。これはいけるのでは?と思いつつ登録実行するとシステムエラー。でも一覧画面に戻ってみると…

うーん。もう何だか分からん。

もうちょっと App Engine Plugin + Gorm-JPA のドキュメントが増えてくれれば何とかなるかもだけど。もう少しJPAをじっくり勉強するべきか。 Gorm 使えないと Grails の魅力が半減している気がしてしょうがない。

Gormを捨てて、奥さんが関西Groovy勉強会で説明してくれた JDO の方を選択しようかな。

2019-02-21gae, Grails