(転送用の)シンプルなDTO

概要

例えば、Flex や JSON などのデータ転送の仕組みと連携する際、DBFluteの Entity クラスでは相性的な不都合があるかもしれません。 そこで、DBFluteランタイムやその他クラスに依存せず、データ転送ライブラリの仕様次第で微調整ができる "シンプルなDTO" (SimpleDto) をDBFluteで自動生成できます。

さらに、DB側とやりとりするために、 "DBFlute の Entity" と SimpleDto を連携させる "DTOのマッパー" (DtoMapper) も自動生成できます。

他のフレームワークとのアダプタ的な役割を担う性質上、つどつど進化させていく必要のある機能であるため、 固定的なドキュメントを作成していません。また、EntityやConditionBeanなどと比べて、細かい仕様面で制限がある可能性もあります。 利用する際は SimpleDto を 使った Example を参考にすると良いでしょう。

SimpleDtoの概念図

図 : SimpleDtoの概念図 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 を自動生成し、区分値も関連付けています。

DBFlute Example - DIコンテナ

Flex とのExample

dbflute-flexserver-example にて、Flex との連携を想定した SimpleDto を自動生成しています。DtoMapper も同時に自動生成していますが、SimpleCDef は自動生成していません。パターンを網羅するためだけにそうしているだけで、区分値を利用しない理由は特にFlexとは関係ありません。

DBFlute Example - 他のフレームワークとの組み合わせ

SimpleCDef のみのExample

dbflute-sqlite-example にて、SimpleCDef のみを利用しています。 SimpleDto は不要だが、区分値だけはDBFlute依存しない領域で利用したいという場合に有効です。 うまく使えば単なる ENUM 自動生成と言えます。