説明
概要
エンティティクラスのメタデータを読み取り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 |
例
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属性は、全てのエンティティを対象とし、一括で自動生成の有効/無効を制御する場合に使用します。 関連プロパティごとに外部キー制約の生成を制御するには、 外部キー定義 を参照してください。