About

ドキュメント

Javadoc

モジュール

プロジェクト文書

Built by Maven

説明

概要

エンティティクラスのメタデータを読み取りDDLスクリプトを生成します。 このタスクでは、次のオブジェクトのcreate文とdrop文を生成します。

  • テーブル
  • シーケンス
  • 一意キー
  • 外部キー
  • 補助的オブジェクト(データベース固有のオブジェクト。主に微調整のために使用される。)

また、dump属性が"true"の場合、DDLファイルの生成と同時にデータベースのデータをCSV形式でダンプ出力します。 DDLファイルとダンプファイルは、migrateDir属性に指定されたディレクトリ以下に出力されます。

このタスクは、DDLを生成しますが、生成したDDLをデータベースへ適用するわけではありません。 DDLのデータベースへの適用はMigrate タスクが担います。

ディレクトリ構成

デフォルトの属性値を利用する場合、Gen-Ddlタスクにより作成されるディレクトリの構成は次のようになります。

db
└─migrate
    ├─0000
    │  ├─create
    │  └─drop
    │     ├─010-foreignkey
    │     ├─020-sequence
    │     ├─030-uniquekey
    │     ├─040-table
    │     └─050-auxiliary
    ├─0001
    │  ├─create
    │  │  ├─010-table
    │  │  ├─020-uniquekey
    │  │  ├─030-sequence
    │  │  ├─040-dump
    │  │  ├─050-foreignkey
    │  │  └─060-auxiliary
    │  └─drop
    │     ├─010-foreignkey
    │     ├─020-sequence
    │     ├─030-uniquekey
    │     ├─040-table
    │     └─050-auxiliary
    └─0002
        ├─create
        │  ├─010-table
        │  ├─020-uniquekey
        │  ├─030-sequence
        │  ├─040-dump
        │  ├─050-foreignkey
        │  └─060-auxiliary
        └─drop
           ├─010-foreignkey
           ├─020-sequence
           ├─030-uniquekey
           ├─040-table
           └─050-auxiliary

db/migrateディレクトリ以下の、0000、0001、0002はDDLのバージョンを表すディレクトリです。 バージョンを表すディレクトリは、Gen-Ddlタスクを実行するごとに新しく作成されます。

バージョンを表すディレクトリの下にはcreateディレクトリとdropディレクトリがあります。 createディレクトリでは、データベースオブジェクトの作成用DDLとダンプデータを管理し、 dropディレクトリでは、データベースオブジェクトの削除用DDLを管理します。

createディレクトリとdropディレクトリの下には、各オブジェクト専用のDDLもしくはダンプデータを管理するためのディレクトリがあります。

バージョン番号

DDLのバージョン番号は、ddlInfoFile属性に指定したテキストファイルで管理されます。 バージョン番号は0から始まり、上限の2147483647まで1ずつ増分します。 バージョン番号を管理するテキストファイルは、番号を振り直すなどの特別な理由がない限り編集しないでください。

DDLファイル

エンティティクラスの定義からDDLファイルが出力されます。 どのようなエンティティ定義からどのようなDDLを生成できるかは、DDL生成のためのエンティティ定義 を参照してください。

Gen-Ddlタスクでサポートしていないストアドプロシージャー、トリガー、ビューなどのDDLを扱うには、Migrateタスクの任意のSQLの実行 を参照してください。

出力先のディレクトリはパラメータにより変更できます。

生成されるファイルの形式は、SQLファイル と同様です。

ダンプファイル

dump属性が"true"の場合、データベースのデータがCSV形式でダンプ出力されます。

出力先のディレクトリはパラメータにより変更できます。

出力されるデータの形式は、ダンプファイル の説明を参照してください。

タスク実行時のファイルのコピー

Gen-Ddlタスクは、DDLやダンプデータを生成後、生成対象外かつ前バージョンのディレクトリに含まれるファイルを新しいバージョンのディレクトリにコピーします。 この仕組みにより、Gen-Ddlで生成される以外のファイルをGen-Ddlで生成されるファイルと同様の方法で管理できます。

たとえば、バージョン0002のcreateディレクトリの下に061-procedureや062-view、dropディレクトリの下に001-viewや002-procedureといったディレクトリを作成し、そこにストアドプロシージャーやビューの作成用DDLと削除用DDLファイルを置くとします。

db
└─migrate
    └─0002
        ├─create
        │  ├─010-table
        │  ├─020-uniquekey
        │  ├─030-sequence
        │  ├─040-dump
        │  ├─050-foreignkey
        │  ├─060-auxiliary
        │  ├─061-procedure
        │  └─062-view
        └─drop
           ├─001-view
           ├─002-procedure
           ├─010-foreignkey
           ├─020-sequence
           ├─030-uniquekey
           ├─040-table
           └─050-auxiliary

Gen-Ddlタスクを実行すると、これらはバージョン0003のcreateディレクトリやdropディレクトリ以下にそのままコピーされます。

パラメータ

Antタスクへのパラメータを以下に示します。

トップレベルのパラメータ

属性 説明 デフォルト値 必須
classpathDir エンティティクラスを含むクラスパスのディレクトリです。このディレクトリはタスクの実行時のクラスパスに含まれている必要があります。 - YES
rootPackageName ルートパッケージ名です。 "" NO
entityPackageName エンティティクラスのパッケージ名です。エンティティクラスは、rootPackageNameとこの値をピリオドで連結したパッケージに配置されているとみなされます。 "entity" NO
entityClassNamePattern このタスクで対象とするエンティティクラス名の正規表現です。 ".*" NO
ignoreEntityClassNamePattern このタスクで対象としないエンティティクラス名の正規表現です。 "" NO
createTableDirName テーブルを作成するDDLを格納するディレクトリ名です。 "010-table" NO
createUniqueKeyDirName 一意キーを作成するDDLを格納するディレクトリ名です。 "020-uniquekey" NO
createSequenceDirName シーケンスを作成するDDLを格納するディレクトリ名です。 "030-sequence" NO
createForeignKeyDirName 外部キーを作成するDDLを格納するディレクトリ名です。 "050-foreignkey" NO
createAuxiliaryDirName 補助的オブジェクトを作成するDDLを格納するディレクトリ名です。 "060-auxiliary" NO
dropTableDirName テーブルを削除するDDLファイル名です。 "040-table" NO
dropUniqueKeyDirName 一意キーを削除するDDLファイル名です。 "030-uniquekey" NO
dropSequenceDirName シーケンスを削除するDDLファイル名です。 "020-sequence" NO
dropForeignKeyDirName 外部キーを削除するDDLファイル名です。 "010-foreignkey" NO
dropForeignKeyDirName 補助的オブジェクトを削除するDDLファイル名です。 "050-auxiliary" NO
ddlFileEncoding DDLファイルのエンコーディングです。 "UTF-8" NO
sqlKeywordCase SQLのキーワードを大文字にするか小文字にするかを指定する列挙型の値です。大文字にするには"uppercase"、小文字にするには"lowercase"を指定します。テンプレートに記述された文字をそのまま使用する場合は"originalcase"を指定します。 "originalcase" NO
sqlIdentifierCase SQLの識別子を大文字にするか小文字にするかを指定する列挙型の値です。大文字にするには"uppercase"、小文字にするには"lowercase"を指定します。エンティティに記述した文字をそのまま使用する場合は"originalcase"を指定します。 "originalcase" NO
dump "true"の場合、データベースのデータのダンプ出力を行います。 "true" NO
dumpDirName ダンプファイルの出力先のディレクトリです。 "040-dump" NO
dumpFileEncoding ダンプファイルのエンコーディングです。 "UTF-8" NO
applyJavaCommentToDdl "true"の場合、エンティティのJavaDocコメントをテーブル作成用のDDLファイルに反映させます。クラスのJavaDocコメントはテーブルに反映され、プロパティのJavaDocコメントはカラムに反映されます。"true"を指定する場合、Docletを使用できるようにJDKのtools.jarをクラスパス(classpathもしくはclasspathref)に含める必要があります。対応しているRDBMSは、Oracle、DB2、PostgreSQL、MySQL、H2です。 "false" NO
javaFileSrcDirs Javaソースファイルのディレクトリです。カンマや空白区切りで複数指定できます。applyJavaCommentToDdlに"true"を指定した場合にのみ使用されます。 "src/main/java" NO
javaFileEncoding Javaファイルのエンコーディングです。applyJavaCommentToDdlに"true"を指定した場合にのみ使用されます。 "UTF-8" NO
autoGenerateForeignKey "true"の場合、関連の定義から外部キー制約を自動生成します。"false"の場合、関連の定義から外部キー制約を自動生成しません。 "true" NO
createTableTemplateFileName テーブルを作成するDDLのテンプレートファイル名です。 "sql/create-table.ftl" NO
createUniqueKeyTemplateFileName 一意キーを作成するDDLのテンプレートファイル名です。 "sql/create-uniquekey.ftl" NO
createSequenceTemplateFileName シーケンスを作成するDDLのテンプレートファイル名です。 "sql/create-sequence.ftl" NO
createForeignKeyTemplateFileName 外部キーを作成するDDLのテンプレートファイル名です。 "sql/create-foreignkey.ftl" NO
createAuxiliaryTemplateFileName 補助的オブジェクトを作成するDDLのテンプレートファイル名です。 "sql/create-auxiliary.ftl" NO
dropTableTemplateFileName テーブルを削除するDDLのテンプレートファイル名です。 "sql/drop-table.ftl" NO
dropUniqueKeyTemplateFileName 一意キーを削除するDDLのテンプレートファイル名です。 "sql/drop-uniquekey.ftl" NO
dropSequenceTemplateFileName シーケンスを削除するDDLのテンプレートファイル名です。 "sql/drop-sequence.ftl" NO
dropForeignKeyTemplateFileName 外部キーを削除するDDLのテンプレートファイル名です。 "sql/drop-foreignkey.ftl" NO
dropAuxiliaryTemplateFileName 補助的オブジェクトを削除するDDLのテンプレートファイル名です。 "sql/drop-auxiliary.ftl" NO
templateFileEncoding テンプレートファイルのエンコーディングです。 "UTF-8" NO
templateFilePrimaryDir テンプレートファイルを検索する際の優先ディレクトリです。 - NO
migrateDir マイグレーション用のファイルを管理するディレクトリです。 "db/migrate" NO
ddlInfoFile DDLのバージョン番号を管理するファイルです。 "db/ddl-info.txt" NO
versionNoPattern バージョン番号のパターンです。バージョン番号に対応するディレクトリ名に使用されます。java.text.DecimalFormatで使用可能なパターンを指定できます。 "0000" NO
statementDelimiter SQLステートメントの区切り文字です。 ";" NO
tableOption CREATE TABLE文の最後に付与されるオプションです。MySQLで、データベースのエンジンを指定する場合、たとえば、"ENGINE = INNODB"というように指定できます。 - NO
comment DDLを生成する理由を示すコメントです。エンティティの変更内容を記述するのが適当です。ここに記述した文字列はddlInfoFile属性で指定されたファイルに記録されます。 "" NO
genDialectClassName S2JDBC-Genのダイアレクトインタフェースの実装クラス名です。ここに指定するクラスはorg.seasar.extension.jdbc.gen.dialect.GenDialectインタフェースを実装している必要があります。指定しない場合はS2JDBCのダイアレクト に対応したデフォルトのクラスが使用されます。 - NO
configPath JdbcManagerのコンポーネント定義を含む設定ファイルです。このタスクの実行に使用されます。 "s2jdbc.dicon" NO
env 環境名です。 "ut" NO
jdbcManagerName JdbcManagerのコンポーネント名です。 "jdbcManager" NO
factoryClassName S2JDBC-Genの公開されたインタフェースの実装を作成するファクトリのクラス名です。S2JDBC-Genをカスタマイズする場合に独自のファクトリクラスを指定できます。ここに指定するクラスはorg.seasar.extension.jdbc.gen.internal.factory.Factoryインタフェースを実装している必要があります。 "org.seasar.extension.jdbc.gen
.internal.factory.FactoryImpl"
NO
commandInvokerClassName S2JDBC-Genのコマンドを呼び出すクラスの名前です。コマンドの呼び出し前後で任意の処理を実行したい場合に指定します。ここに指定するクラスはorg.seasar.extension.jdbc.gen.command.CommandInvokerインタフェースを実装している必要があります。 "org.seasar.extension.jdbc.gen
.internal.command.CommandInvokerImpl"
NO
classpath このタスクを実行する際のクラスパスです。 - classpathrefが指定されていない場合YES
classpathref このタスクを実行する際のクラスパスの参照です。 - classpathが指定されていない場合YES

ネストした要素として指定されるパラメータ

jvmArg

このタスクの大部分の処理は別VMで行われます。VMに引数を渡す場合は<jvmarg>要素を使用します。 これはAntのJavaタスクで使用できる<jvmarg>と同じです。 使用可能な属性やネストした要素についてはAntのドキュメントを参照してください。

SQLのキーワードと識別子の大文字小文字を指定する

sqlKeywordCase属性とsqlIdentifierCase属性に"uppercase"や"lowercase"といった値を指定することで、SQLのキーワード(CREATEやALTERなど)やSQLの識別子(テーブル名やカラム名)の大文字小文字を指定できます。 たとえば、次のように指定できます。

<gen-ddl
    classpathDir="build/classes"
    rootPackageName="examples"
    sqlKeywordCase="lowercase"
    sqlIdentifierCase="uppercase"
    classpathRef="classpath"
/>

sqlKeywordCase属性に"lowercase"とsqlIdentifierCase属性に"uppercase"を指定した場合、生成されるSQLは次のようになります。

create table HOGE (AAA varchar(255));

逆に、sqlKeywordCase属性に"uppercase"とsqlIdentifierCase属性に"lowercase"を指定した場合、生成されるSQLは次のようになります。

CREATE TABLE hoge (aaa VARCHAR(255));

独自のテンプレートファイルを使用する

任意のディレクトリに独自のテンプレートファイルを置き、templateFilePrimaryDir属性にそのディレクトリを指定することで、 独自のテンプレートファイルを使用できます。

S2JDBC-Genのテンプレートは、配布ファイルのresources/tempaltesディレクトリ以下にあります。 ここでは、テーブルのcreate文のテンプレートを置き換える例を示します。 テーブルのcreate文のテンプレートトはsql/create-table.ftlです。 修正は、これをコピーして行うと良いでしょう。

テンプレートファイルを格納するディレクトリをmytempletesとする場合、 修正した独自テンプレートを使用するにはテンプレートをmytempletes/sql/create-table.ftlと配置し、templateFilePrimaryDir属性にmytempletesを指定します。

<gen-ddl
    classpathDir="build/classes"
    rootPackageName="examples"
    templateFilePrimaryDir="mytempletes"
    classpathRef="classpath"
/>

mytempletes/my-create-table.ftlのように、テンプレートファイルを任意の名前で配置したい場合は、 templateFilePrimaryDir属性に加え、createTableTemplateFileName属性も指定します。

<gen-ddl
    classpathDir="build/classes"
    rootPackageName="examples"
    templateFilePrimaryDir="mytempletes"
    createTableTemplateFileName="my-create-table.ftl"
    classpathRef="classpath"
/>

MySQLでストレージエンジンを指定する

MySQLでストレージエンジンを指定するには、tableOption属性を使用します。 たとえば、ストレージエンジンにINNODBを使用するにはtableOption属性に次のように指定します。

<gen-ddl
    classpathDir="build/classes"
    rootPackageName="examples"
    tableOption="ENGINE = INNODB"
    classpathRef="classpath"
/>

上記の定義でGen-Ddlタスクを実行すると次のようなDDLが生成されます。

create table HOGE (AAA varchar(255)) ENGINE = INNODB;

バージョンディレクトリのパターンを指定する

デフォルトでは、バージョン番号に対応するディレクトリの名前はバージョン番号が大きくなるにつれ、0000、0001、0002となります。 バージョン番号の前に0をいくつ付与するかは、versionNoPattern属性で調整できます。

<gen-ddl
    classpathDir="build/classes"
    rootPackageName="examples"
    versionNoPattern="00000000"
    classpathRef="classpath"
/>

上記の定義でGen-Ddlタスクを実行すると、バージョン番号に対応するディレクトリの名前はバージョン番号が大きくなるにつれ、00000000、00000001、00000002となります。

DDLを生成する理由を記録する

DDLを生成する理由(エンティティの変更内容)をcomment属性に記述しddlInfoFile属性で指定されたファイルに記録できます。 AntのInputタスクと組み合わせて使用すると良いでしょう。

<input
    message="DDLを生成する理由(エンティティの変更内容)を入力してください。"
    addproperty="gen-ddl.comment"
/>
<gen-ddl
    classpathDir="build/classes"
    rootPackageName="examples"
    comment="${gen-ddl.comment}"
    classpathRef="classpath"
/>

上記の定義を利用すると、コンソールからの入力をコメントとして使用できます。

エンティティのJavaDocコメントをテーブル作成用のDDLファイルに反映させる

エンティティのJavaDocコメントをDDLに反映させるには、applyJavaCommentToDdl属性に"true"を指定します。 また、必要に応じてjavaFileSrcDirs属性とjavaFileEncoding属性を使用します。 javaFileSrcDirs属性については、カンマや空白区切りで複数の値を指定できることに注意してください。

<gen-ddl
    classpathDir="build/classes"
    rootPackageName="examples"
    applyJavaCommentToDdl="true"
    javaFileSrcDirs="src1, src2"
    javaFileEncoding="MS932"
    classpathRef="classpath"
/>

この機能では、Docletを使用してソースコード上のコメントを読み取るため、クラスパスにJDKのtools.jarが指定されている必要があります。 コメントに対応していないRDBMSでは、applyJavaCommentToDdl属性に"true"を指定しても、JavaDocコメントはDDLに反映されません。

外部キー制約の自動生成を無効化する

デフォルトでは、関連プロパティに対応するカラムが外部キーとみなされDDLが自動生成されます。 これを無効にするには、autoGenerateForeignKey属性に"false"を設定します。

<gen-ddl
    classpathDir="build/classes"
    rootPackageName="examples"
    autoGenerateForeignKey="false"
    classpathRef="classpath"
/>

上の定義を利用すると、外部キー制約のDDLが自動生成されなくなります。

autoGenerateForeignKey属性は、全てのエンティティを対象とし、一括で自動生成の有効/無効を制御する場合に使用します。 関連プロパティごとに外部キー制約の生成を制御するには、 外部キー定義 を参照してください。