(転送用の)シンプルな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 自動生成と言えます。