tezu memo blog

日々行った作業をメモしていきます

Grails GORM Enum

Domainクラスのint型属性をEnumに変更

1. Enum作成。#getIdを実装。これで任意の値をDBに登録出来る
[#GRAILS-3633] Enhanced Enum support - Grails JIRA

If the enum has an instance method "getId()" which has a return type

public enum Sex {
    MAN(1),WOMAN(2);
    private int id;
    private Sex(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }
}

2. Domainクラス intからEnumに変更

import groovy.transform.ToString

@ToString
class Member {
    Date dateCreated
    Date lastUpdated

    String mail
    String firstName
    String lastName
    String password
//  int sex;
    Sex sex;
    String tel
    String zip
    String prefectures
    String address1
    String address2
    String memo
}

3. 初期データ 数値からenumに変更(sex:2 → sex:Sex.WOMAN)。Groovy SQL便利ですね

import groovy.sql.Sql
import jp.gr.java_conf.tezu.grails.ec.Member
import jp.gr.java_conf.tezu.grails.ec.Sex

class BootStrap {

    def sessionFactory

    def init = { servletContext ->
        if (Member.count() != 0) {
            Member.getAll().each { entity ->
                entity.delete()
            }
        }
        def entity = new Member(mail:"xxxxx@gmail.com",firstName:"Taro",lastName:"Grails",password:"password",sex:Sex.WOMAN,tel:"0611112222",zip:"1008924",prefectures:"東京都",address1:"千代田区永田町1-10-1")
        if (!entity.save(flush:true)) {
            entity.errors.each { println it }
        }
        
        def conn = new Sql(sessionFactory.currentSession.connection())
        println conn.rows('SELECT * FROM INFORMATION_SCHEMA.TABLES')
        println conn.rows('SELECT SEX FROM MEMBER')
    }
    def destroy = {
    }
}

4.期待通りの結果。SEXカラムの型がgetIdメソッドの戻り値と一致、共にINTEGER型。値はWOMANの2

| Loading Grails 2.1.1
| Configuring classpath.
| Environment set to development.....
| Packaging Grails application....
| Running Grails application
==================================================================
            Application: sample-grails-ec-admin 0.1            
            ---------------------------------------            
  Environment: DEVELOPMENT
  Database configuration: 
    Hibernate DDL mode: create-drop
    URL: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000
    Driver: org.h2.Driver
    User: sa
==================================================================
[[TABLE_CATALOG:DEVDB, TABLE_SCHEMA:PUBLIC, TABLE_NAME:MEMBER, TABLE_TYPE:TABLE, STORAGE_TYPE:MEMORY, SQL:CREATE MEMORY TABLE PUBLIC.MEMBER(
    ID BIGINT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_02BEEBC1_0499_4CA9_AE69_566A56FEE7FA) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_02BEEBC1_0499_4CA9_AE69_566A56FEE7FA,
    VERSION BIGINT NOT NULL,
    ADDRESS1 VARCHAR(255) NOT NULL,
    ADDRESS2 VARCHAR(255),
    DATE_CREATED TIMESTAMP NOT NULL,
    FIRST_NAME VARCHAR(255) NOT NULL,
    LAST_NAME VARCHAR(255) NOT NULL,
    LAST_UPDATED TIMESTAMP NOT NULL,
    MAIL VARCHAR(255) NOT NULL,
    MEMO VARCHAR(255),
    PASSWORD VARCHAR(255) NOT NULL,
    PREFECTURES VARCHAR(255) NOT NULL,
    SEX INTEGER NOT NULL,
    TEL VARCHAR(255) NOT NULL,
    ZIP VARCHAR(255) NOT NULL
)
[[SEX:2]]