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]]