classificationDefinitionMap

classificationDefinitionMapとは?

区分値の定義を行うためのDBFluteプロパティ。DBFluteクライアントの dfprop 配下の classificationDefinitionMap.dfprop という名前のテキストファイルです。主に Generateタスク から参照されます。Generateタスクを実行すると、定義された区分値をタイプセーフに扱うことができるメソッドが生成され、 区分値の定義情報と実装の一致を実現することができます。

テーブル区分値と暗黙の区分値

区分値は、主に大きく二つに分けられます。区分値に対応するテーブルが存在する "テーブル区分値"、テーブルは存在せず業務的に(暗黙の)定義付けられる "暗黙の区分値"。このプロパティを設定する前にこの概念を理解するようにして下さい。

区分値要素の属性

区分値要素を構成する幾つかの決められた属性があります。 このプロパティを設定する前にこの概念を理解するようにして下さい。

区分値情報がドキュメントに

定義した区分値情報は、プログラム上で利用するだけでなく、ドキュメントになります。

プロパティ

map型プロパティ で、一つの区分値とその区分値の要素についての情報を定義します。

区分値要素を map型プロパティ で指定していきますが、table プロパティを利用する場合は、テーブル区分値 として扱われるようになります。逆にそうでないものは、暗黙の区分値 として扱われるようになります。

classificationDefinitionMapの仕様 @classificationDefinitionMap.dfprop
map:{
    [classification-name] = list:{
        ; map:{
            ; topComment=[comment]; dataType=[String(default) or Number]
            ; isCheckImplicitSet=[true or false(default)]
            ; isUseDocumentOnly=[true or false(default)]
            ; isSuppressAutoDeploy=[true or false(default)]
            ; isSuppressDBAccessClass=[true or false(default)]
            ; groupingMap = ; map:{
                ; [group-name] = ; map:{
                    ; groupComment = [group-comment]
                    ; elementList = list:{[element-name] ; ...}
                }
            }
        }
        ; map:{code=[code]; name=[name]; alias=[alias]; comment=[comment]}
        ; map:{
            ; table=[table-name]
            ; code=[column-name for code]; name=[column-name for name]
            ; alias=[column-name for alias]; comment=[column-name for comment]}
            ; where=[condition for select]; orderBy=[column-name for ordering]
            ; exceptCodeList=[the list of except code]
        }
    }
    ; ...

以下、(*)の付いたプロパティは必須です。

classification-name (*)

区分値の名前です。そのままENUMのクラス名として利用されますので、プログラム上のENUMクラスとして扱える名前である必要があります。

topComment (*)

区分値についての説明を定義します。区分値自体の名前や、わかりやすい説明があると良いでしょう。

このプロパティは必ず定義されている必要があります。 (厳密には定義しなくても動作することもありますが、幾つかのプロパティなどでは topComment が存在していることが前提となるため、仕様としては必須項目です)

値候補
どのような区分値であるかの説明文
デフォルト
なし
補足
  • 生成する区分値メソッドのJavadocに出力
  • Javadocに適した内容であること

codeType

区分値のコードの型を指定します。

値候補
String or Number or Boolean
デフォルト
String

このプロパティを指定しても、CDefクラス(ENUM)のコード値の型はString型のまま変わりません。 このプロパティは、CDefクラスがテーブルのカラムとの関連から独立して利用されるような状況の場合、 例えば、ParameterBeanのプロパティとして区分値の型(CDef)を直接利用するような場合に、 JDBCへのバインドするときの型の判定の材料になるなど、その他特別な機能における調整の場で利用されます。

逆に言うと、このプロパティを指定しなくても(デフォルトはString)、 区分値の基本的な機能(ConditionBeanやEntityにおける区分値メソッドなど)は利用できますが、 習慣的に指定しておくことをお奨めします。

isCheckImplicitSet

暗黙の区分値の場合に、ReplaceSchemaのデータ登録やEntityへの区分値設定において、 定義されている区分値要素以外のコードが指定されたかどうかチェックします。定義されていないコードの場合は例外になります。 @since 0.9.9.1B

値候補
true or false
デフォルト
false

ConditionBean での条件設定ではチェックされません。 あくまで、データ登録という面でのチェックなので、(自動生成されるクラスとしては)Entityの Setter メソッドのみにおいてチェックされます。

isUseDocumentOnly

その区分値を、自動生成されたクラスでは利用せず、SchemaHTMLなどのドキュメントのみでの利用をする場合に設定します。 プログラムのロジックとしては区分値を意識しないような場合に有効です(不要なメソッドが生成されない)。 @since 0.9.9.1B

値候補
true or false
デフォルト
false

実装としては、Docタスク、ReplaceSchemaタスクにおいてのみ認識される区分値、という単純なロジックになっています。 よって、細かい挙動において、それに依存することがあります。

isSuppressAutoDeploy

テーブル区分値において、DBFluteが自動でカラムに関連付けるのを抑制します。 通常の利用では、このプロパティはまず必要ありません。 @since 0.9.9.1B

値候補
true or false
デフォルト
false
補足
  • テーブル区分値を使用する場合のみ有効
  • 通常のテーブル区分値では抑制する必要はない
  • All-in-Oneテーブル区分値の場合(のみ)での利用が想定される

isSuppressDBAccessClass

テーブル区分値において、Behaviorの自動生成を抑制します。 テーブル区分値でBehaviorが不要な場合に、メモリ領域の節約として利用できます。 @since 1.0.5B

値候補
true or false
デフォルト
false

groupingMap

とある複数の区分値が業務的な意味を持つような場合のグルーピング定義を指定します。@since 0.9.9.7A

値候補
グルーピング定義のmap (グループ名と区分値要素の指定)
デフォルト
なし
補足
  • 暗黙の区分値でもテーブル区分値でも利用可能
  • 区分値要素は、区分値要素の名前を指定 (コードではない)
  • 存在しない区分値を指定した場合は自動生成時にコンパイルエラー

deprecatedMap

非推奨となった区分値要素に、Deprecatedを指定します。@since 1.0.4F

値候補
非推奨定義のmap
map:{区分値要素のname = 非推奨となった理由}
デフォルト
なし
補足
  • 非推奨の区分値要素のメソッドはプログラム上で deprecated になる
  • 暗黙の区分値でもテーブル区分値でも利用可能
  • mapのキーとなる区分値要素は、区分値要素の名前を指定 (コードではない)

table

テーブル区分値を利用するときの該当するテーブル名を指定します。同時に該当区分値がテーブル区分値であることを示します。

テーブル区分値の場合は、table の無い通常の区分値要素の定義は不要です。区分値要素の情報は実際のDBから検索して取得されます。 よって、この場合は基本的に一つの区分値におけるmap型プロパティの定義は二つだけとなります(topComment用とテーブル区分値用)。

table を付与したmap型プロパティでは、code や name などは、値そのものではなく、その値を格納しているカラム名を指定します。

code
コードに対応するカラム
name
名前(識別名)に対応するカラム
alias
別名(表示名)に対応するカラム
comment
コメントに対応するカラム

指定されたカラムで(DBFluteタスク内で)そのままSQLを実行しますので、実行できる形式で指定して下さい。 (例えば、大文字小文字を区別するDBMS環境であれば、必ずそれに合わせた名前で書くようにします)

テーブル名のクォート

指定されたテーブル名において、littleAdjustmentMap.dfprop の設定でクォート対象になっているか、 空白やハイフンなどのプログラム上のクラス名などで利用できない文字が利用されている場合、 該当テーブルからデータを取得する内部的な処理(SQL)において自動的にクォートされます。 これは、code や name などのカラム名を指定するプロパティでも同様です。 (where や order はSQL表現を指定するプロパティなので除外)

テーブル名のSQL表現

自動クォートの機能があるため、例えば、関連テーブルを参照するためにテーブル名に加えて結合処理などをそのままこのプロパティに書くと、まるごとクォートされてしまいます。 このプロパティの先頭に $sql: と付与することでSQL表現がそのまま記述でき、クォート処理は施さずそのままSQLに反映させることができます(@since 0.9.8.2)。 コメントの内容として関連テーブルのカラムの値を参照したい、 テーブル区分値が階層構造になっていて、どの親カテゴリに属しているのかをコメントで表現したい、というような場合に有効です。

この機能は、カラム名を指定する code や name なども同様に利用できます。一方で、where や orderBy は、そもそもの仕様がSQL表現のため指定は不要です。

code (*)

それぞれの区分値要素のコード値を指定します。(暗黙の区分値の場合)

値候補
区分値要素の実際にDBに格納する値
デフォルト
なし
補足
  • テーブル区分値の場合は、コードに対応するカラムの名前を指定

大文字小文字区別なしで等しいコード値、例えば "FOO" と "foo" は別要素として定義できません。 テーブル区分値における指定されたカラムから取得されたコード値でも同様です。

name (*)

区分値要素の名前(識別名)を指定します。(暗黙の区分値の場合)

値候補
区分値要素のわかりやすい名前 (基本、英語名を想定)
デフォルト
なし
補足
  • 主に区分値メソッドの名前の一部に利用される
  • プログラム上のメソッド名に適した名前であること
  • テーブル区分値の場合は、名前に対応するカラムの名前を指定

alias

区分値要素の別名(表示名)を指定します。(暗黙の区分値の場合)

値候補
区分値要素のわかりやすいローカル言語(和名など)での名前
デフォルト
name と同じ
補足
  • 生成する区分値メソッドのJavadocに出力
  • Javadocに適した内容であること
  • テーブル区分値の場合は、別名に対応するカラムの名前を指定

comment

区分値要素の説明を指定します。(暗黙の区分値の場合)

値候補
区分値要素のわかりやすい説明
デフォルト
なし
補足
  • 生成する区分値メソッドのJavadocに出力
  • Javadocに適した内容であること
  • テーブル区分値の場合は、コメントに対応するカラムの名前を指定

sisterCode

code で指定されたコード値とは別に、コード値として扱うことのできる姉妹コードを指定します。(暗黙の区分値の場合) @since 0.9.9.4B

値候補
コード値、もしくは、コード値のリスト
デフォルト
なし
補足
  • 複数の場合は、list:{} 形式で指定

※テーブル区分値では利用できません。

subItemMap

区分値に追加する独自の属性を指定します。 @since 0.9.9.3C

値候補
キー値と実際の値のマップ
デフォルト
なし
補足
  • 全ての区分値要素に同じキーの属性が設定されている場合、CDefにそのキー名のメソッドが追加される
  • 値としてmapやlist形式を利用しても、単なる文字列となるためパースが必要
  • テーブル区分値の場合は、値の代わりに対応するカラムを指定

where

テーブルから区分値を取得する際の絞り込み条件を指定します。(テーブル区分値専用)

値候補
SQLのwhere句の条件式 (簡易なものに限る)
デフォルト
なし
補足
  • 主には削除フラグなどを条件にすることを想定
  • テーブル区分値を使用する場合のみ有効

orderBy

テーブルから区分値を取得する際のソート条件を指定します。(テーブル区分値専用)

値候補
ソートするカラム名 (+ asc or desc)
デフォルト
なし
補足
  • 主には表示順カラムなどを指定することを想定
  • テーブル区分値を使用する場合のみ有効

exceptCodeList

テーブルから区分値を取得する際に除外するコード値を指定します。(テーブル区分値専用)

値候補
除外するDBのコード値
デフォルト
なし
補足
  • 固定であるコードを除外したい場合に有効
  • テーブル区分値を使用する場合のみ有効

dfpropファイルの分割

ある程度は工夫...

この dfprop は、しっかり使いこなし始めると、かなり大きなファイルになる可能性があります。

ある程度は、改行を工夫して、ファイルが長くならないようにしますが...

e.g. あまり縦長にしないようにいいかんじに @classificationDefinitionMap.dfprop
map:{
    ; MemberStatus = list:{
        ; map:{topComment=入会から退会までの会員のステータスを示す; codeType=String}
        ; map:{
            ; table = MEMBER_STATUS ; code = MEMBER_STATUS_CODE
            ; name = MEMBER_STATUS_NAME ; comment = DESCRIPTION
        }
    }
    ...
}

焼け石に水です。

ファイルを分割しよう

かなり大きくなってきたら、会員系、商品系、レポート系など、カテゴリごとにファイルを分割すると良いでしょう。

e.g. カテゴリごとにファイルを分割 @Directory
dfprop
 |-...
 |-classificationDefinitionMap_land.dfprop  // ランド系
 |-classificationDefinitionMap_sea.dfprop   // シー系
 |-classificationDefinitionMap.dfprop       // 本体
 |-...
e.g. ファイル分割の設定を本体のdfpropにて @classificationDefinitionMap.dfprop
map:{
    ; $$split$$ = map:{
        ; land = dummy
        ; sea = dummy
    }

    # 本体の dfprop にも定義はできる
    ; MemberStatus = list:{
        ; map:{topComment=入会から退会までの会員のステータスを示す; codeType=String}
        ; map:{
            ; table = MEMBER_STATUS ; code = MEMBER_STATUS_CODE
            ; name = MEMBER_STATUS_NAME ; comment = DESCRIPTION
        }
    }
    ...
}

dummyは、将来拡張のための固定値です。

EMechaによるキー重複チェックが、ファイル間では効かないので設定ミスに注意しましょう。

Example

テーブル区分値

e.g. テーブル区分値を利用する例 {会員ステータス} @classificationDefinitionMap.dfprop
map:{
    ; MemberStatus = list:{
        ; map:{topComment=入会から退会までの会員のステータスを示す; codeType=String}
        ; map:{
            ; table = MEMBER_STATUS
            ; code  = MEMBER_STATUS_CODE ; name = MEMBER_STATUS_NAME
            ; alias  = MEMBER_STATUS_ALIAS ; comment  = DESCRIPTION
            ; where = DELETE_FLG != 0 # 条件で除外
            ; orderBy = DISPLAY_ORDER
            ; exceptCodeList = list:{FOO ; BAR} # 固定で除外
            ; suppressAutoDeploy = false
        }
    }
    ...
}

暗黙の区分値

e.g. 暗黙の区分値を利用する例 {会員ステータス} @classificationDefinitionMap.dfprop
map:{
    ; MemberStatus = list:{
        ; map:{topComment=入会から退会までの会員のステータスを示す; codeType=String}
        ; map:{code=PRV;name=Provisional;alias=仮会員  ;comment=入会直後のステータスで一部のサイトサービスが利用可能}
        ; map:{code=FML;name=Formalized ;alias=正式会員;comment=正式な会員としてサイトサービスが利用可能}
        ; map:{code=WDL;name=Withdrawal ;alias=退会会員;comment=退会が確定した会員でサイトサービスはダメ}
    }
    ...
}
e.g. 暗黙の区分値を利用する例 {フラグ} @classificationDefinitionMap.dfprop
map:{
    ; Flg = list:{
        ; map:{topComment=フラグを示す; codeType=Number}
        ; map:{code=1; name=True ; alias=はい  ; comment=有効を示す}
        ; map:{code=0; name=False; alias=いいえ; comment=無効を示す}
    }
    ...
}

グルーピング定義

e.g. サービスが利用可能なステータスのグルーピング定義 @classificationDefinitionMap.dfprop
map:{
    ; MemberStatus = list:{
        ; map:{
            ; topComment=会員ステータス; codeType=String
            ; groupingMap = map:{
                ; serviceAvailable = map:{
                    ; groupComment = サービスが利用できる会員
                    ; elementList = list:{正式会員;仮会員}
                }
                ...
            }
        }
        ; map:{ ... }
        ...
    }
    ...
}

姉妹コード

e.g. 暗黙の区分値で姉妹コードを利用する例 {Flg} @classificationDefinitionMap.dfprop
map:{
    ; Flg = list:{
        ; map:{topComment=フラグ; codeType=Number}
        ; map:{
            ; code=1; name=True; alias=Checked; comment=フラグが立っている
            ; sisterCode=true
        }
        ; map:{
            code=0; name=False; alias=Unchecked; comment=フラグが立っていない
            ; sisterCode=false
        }
    }
    ...
}

独自の属性

e.g. 暗黙の区分値で姉妹コードを利用する例 {Flg} @classificationDefinitionMap.dfprop
map:{
    ; FooBar = list:{
        ; map:{topComment=独自の属性のExample; codeType=String}
        ; map:{
            ; code=FOO; name=Foo; alias=Who; comment=Fooさん
            ; subItemMap=map:{
                ; priceType=ABC ; rank=2
            }
        }
        ; map:{
            ; code=BAR; name=Bar; alias=Ver; comment=Barさん
            ; subItemMap=map:{
                ; priceType=XYZ ; rank=5
            }
        }
    }
    ...
}

テーブル区分値のSQL表現

e.g. テーブル区分値のSQL表現の例 (階層型) @classificationDefinitionMap.dfprop
map:{
    ; Genre = list:{
        ; map:{topComment=Genre of Music; codeType=Number}
        ; map:{
            ; table=$sql: GENRE loc left outer join GENRE rel on loc.PARENT_ID = rel.GENRE_ID
            ; code=$sql: loc.GENRE_ID; name=$sql: loc.GENRE_NAME
            ; comment=$sql: 'of ' || rel.GENRE_NAME
            ; orderBy=loc.PARENT_ID is not null, loc.GENRE_ID
        }
    }
    ...
}

非推奨の区分値要素

e.g. 非推奨の区分値要素を指定する例 {会員ステータス} @classificationDefinitionMap.dfprop
map:{
    ; MemberStatus = list:{
        ; map:{
            ; topComment=入会から退会までの会員のステータスを示す; codeType=String
            ; deprecatedMap = map:{ 仮会員 = もう仮なんて言わせないから }
        }
        ...
    }
    ...
}