(転送用の)シンプルなDTO
概要
例えば、Flex や JSON などのデータ転送の仕組みと連携する際、DBFluteの Entity クラスでは相性的な不都合があるかもしれません。 そこで、DBFluteランタイムやその他クラスに依存せず、データ転送ライブラリの仕様次第で微調整ができる "シンプルなDTO" (SimpleDto) をDBFluteで自動生成できます。
さらに、DB側とやりとりするために、 "DBFlute の Entity" と SimpleDto を連携させる "DTOのマッパー" (DtoMapper) も自動生成できます。
他のフレームワークとのアダプタ的な役割を担う性質上、つどつど進化させていく必要のある機能であるため、 固定的なドキュメントを作成していません。また、EntityやConditionBeanなどと比べて、細かい仕様面で制限がある可能性もあります。 利用する際は SimpleDto を 使った Example を参考にすると良いでしょう。
SimpleDtoの概念図
自動生成の設定
DBFluteプロパティの simpleDtoDefinitionMap.dfprop にて設定することで自動生成されます。
この dfprop ファイルは、セットアップデフォルトして用意されていませんので、ファイル自体を手動で作成する必要があります。 SimpleDto を使った Example からコピーして土台にすると良いでしょう。dbflute-flexserver-example にて SimpleDto が利用されています。
SimpleDto は、baseDtoPackage と extendedDtoPackage を定義することで自動生成されるようになります。DtoMapper は、extendedMapperPackage @since 0.9.9.1B もしくは dtoMapperPackage @until 0.9.9.1A を定義することで自動生成されます。
区分値メソッドを生成する
Simple が特徴なのでデフォルトでは区分値メソッドは生成されませんが、 (連携する仕組みとの相性的に問題ないのであれば)区分値メソッドを関連付けすることができます。その際、DBFlute側の CDef を直接参照せず、同じく Simple な専用の CDef (SimpleCDef) を生成して参照します。@since 0.9.8.8
SimpleCDef は、simpleDtoDefinitionMap.dfprop の simpleCDefClass と simpleCDefPackage を定義することで自動生成されます。さらに、isClassificationDeployment を true に設定すると区分値が SimpleDto に関連付けられます。
転送側の仕組みに適応させる
JSONICに適応させる
例えば日付型のデータ、JSONIC で JSON に変換するとデフォルトでは JSON 上ではミリ秒で管理されますが、yyyy-MM-dd HH:mm:ss の形式で変換したいというような場合に、SimpleDto に JSONIC の JSONHint アノテーションを指定して任意のフォーマットで変換することができます。@since 0.9.8.8
simpleDtoDefinitionMap.dfprop の jsonicDecorationMap の datePattern, timestampPattern, timePattern プロパティにて、JSONHint アノテーションの format 属性に設定したい値を指定します。
詳しくは、dbflute-guice-example にて。
GWTに適応させる
GWT では、SimpleDateFormat など幾つかの利用できない JavaAPI が存在します。それらを抑制し調整して GWT で利用できる形式の DTO にすることができます。@since 0.9.9.1A
simpleDtoDefinitionMap.dfprop の gwtDecorationMap の isSuppressJavaDependency プロパティを true にすることで実現できます。GWT のExampleではありませんが、JSON とのExampleの simpleDtoDefinitionMap.dfprop にて、このプロパティの(コメントアウト)テンプレートがあります。
主な細かい仕様
主な細かい仕様を列挙します。
- DTO上の無効な区分値は null に
- DtoMapper で Entity に値を設定する際、DTO上の区分値が存在しない場合、 Entity には null で登録されます。(CDef の codeOf() を利用されるため、そのような挙動となります)
- ApplicationOutsideSql のマッパーはアプリ側に
- ApplicationOutsideSql の外だしSQLに対応する SimpleDto と DtoMapper は、そのアプリ側のディレクトリに自動生成されます。 SimpleDto や DtoMapper の outputDirectory の設定は無視されます。
- ネイティブ型のSetterは削除されない
- 区分値に関連付いているカラムの場合で、(EntityやConditionBeanに対する)ネイティブ型のSetterを削除するオプションが設定されている場合でも、 SimpleDto の方の Setter は削除されません。Simple で他のフレームワークと連携させるというコンセプトからそのようにしています。
- 古いテーブルのDTOの自動削除はされない @until 0.9.9.0D
- EntityやConditionBeanなどは古いテーブルに対応するクラスが自動削除されますが、SimpleDto に関してはその機能はありません。
SimpleDto の Example
それぞれパターンごとの Example があります。
JSON とのExample
dbflute-guice-example にて、JSON との連携を想定した Example があります。 単体テストで JSON との変換を行っています。 SimpleDto, DtoMapper, SimpleCDef を自動生成し、区分値も関連付けています。
Flex とのExample
dbflute-flexserver-example にて、Flex との連携を想定した SimpleDto を自動生成しています。DtoMapper も同時に自動生成していますが、SimpleCDef は自動生成していません。パターンを網羅するためだけにそうしているだけで、区分値を利用しない理由は特にFlexとは関係ありません。
SimpleCDef のみのExample
dbflute-sqlite-example にて、SimpleCDef のみを利用しています。 SimpleDto は不要だが、区分値だけはDBFlute依存しない領域で利用したいという場合に有効です。 うまく使えば単なる ENUM 自動生成と言えます。