About

ドキュメント

Javadoc

モジュール

プロジェクト文書

Built by Maven

説明

概要

データベースのメタデータを読み取りエンティティクラスのコードを生成します。エンティティクラスとは、データベースのテーブルに対応するクラスです。

例えば、次のようなコードを生成できます。

/**
 * Departmentエンティティクラスです。
 * 
 * @author S2JDBC-Gen
 */
@Entity
public class Department {

    /** departmentIdプロパティ */
    @Id
    @Column(nullable = false, unique = true)
    public Integer departmentId;

    /** departmentNameプロパティ */
    @Column(length = 20, nullable = true, unique = false)
    public String departmentName;

    /** employees関連プロパティ */
    @OneToMany(mappedBy = "department")
    public List<Employee> employeeList;
}

これは、次のDDLで表されるDEPARATMENTテーブルに対応します。

create table DEPARTMENT (
    DEPARTMENT_ID integer not null primary key, 
    DEPARTMENT_NAME varchar(20)
);

エンティティクラスは、自由に修正して利用できます。

メタデータの利用

Gen-Entiyタスクは、データベースのメタデータを参照し、次の情報からコードを生成します。

  • テーブル
    • カタログ名
    • スキーマ名
    • テーブル名
    • コメント
  • カラム
    • カラム名
    • データ型
    • NOT NULL制約
    • コメント
  • 外部キー(主キーを参照するもののみ)
  • 一意キー

コメントの情報は、データベースによっては提供されない場合があります。 また、Javaコードに反映するにはapplyDbCommentToJava属性に"true"を指定する必要があります。

Oracle Databaseでは、日本語を含むテーブル名については、一意キー制約の情報をデータベースのメタデータから取得できません。 そのため、3つの点でコードが正しく生成されないという制限があります。コード生成後、手動で修正してください。

  1. 該当のテーブルに単一の一意キー制約が存在しても、@Columnのunique要素がtrueになりません。
  2. 該当のテーブルに複合一意キー制約が存在しても、@TableのuniqueConstraints要素にキーとなるカラム名が指定されません。
  3. 該当のテーブルの外部キーのカラムに一意キー制約が存在しても、@OneToOneが指定されません。代わりに@ManyToOneが指定されます。

データベースのデータ型とJavaの型の対応表

生成されるエンティティのプロパティの型は、対応するカラムのデータ型により決まります。

以下の表では、代表的なデータベースについて、データベースのデータ型がJavaのどの型に対応するかを示しています。 例えば、SQL Server 2005のbigint型はJavaのLong型に対応します。 ハイフン(-)は対応するデータ型がないことを示します。

Javaの型 Oracle Database SQL Server 2005 DB2 PostgreSQL MySQL
Boolean - bit - boolean
bool
boolean
bool
bit(0)
Byte - - - - tinyint
Short number
numeric
decimal
(※精度が5未満、スケールが0)
smallint
tinyint
smallint int2
smallint
smallint
tinyint unsigned
Integer number
numeric
decimal
(※精度が10未満、スケールが0)
int integer int4
integer
int
serial
serial4
int
integer
smallint unsigned
Long number
numeric
decimal
(※精度が19未満、スケールが0)
bigint bigint int8
serial8
bitint
bigserial
bigint
integer unsigned
BigInteger number
numeric
decimal
(※精度が19以上、スケールが0)
- - - bigint unsigned
BigDecimal number
numeric
decimal
(※スケールが1以上)
smallmoney
money
decimal
numeric
decimal decimal
numeric
numeric
decimal
dec
Float float
binary_float
float
real
real float4
real
money
-
Double binary_double double double float8
double precision
real
String char
varchar
varchar2
nchar
nvarchar
nvarchar2
char
varchar
nchar
nvarchar
char
varchar
long varchar
char
bpchar
character
character varying
varchar
char
varchar
@LobつきString clob
nclob
varchar(max)
nvarchar(max)
text
ntext
clob text tinytext
text
mediumtext
longtext
byte[] raw
long raw
binary
varbinary
char for bit data
varchar for bit data
long varchar for bit data
bit
bit varying
varbit
bytea
bit
tinyblob
blob
mediumblob
longblob
@Lobつきbyte[] blob binary
image
varbinary(max)
blob oid tinyblob
blob
mediumblob
longblob
java.sql.Time - - time time
timetz
time
java.sql.Date - - date date date
year
java.sql.Timestamp timestamp smalldatetime
datetime
timestamp timestamp
timestamptz
datetime
timestamp
@Temporal(TeporalType.TIMESTAMP)つきjava.util.Date date - - - -

パラメータ

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

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

属性 説明 デフォルト値 必須
schemaName このタスクが対象とするスキーマ名です。 - NO
tableNamePattern このタスクが対象とするテーブル名の正規表現です。 ".*" NO
ignoreTableNamePattern このタスクが対象としないテーブル名の正規表現です。 "(SCHEMA_INFO|.*\$.*)" NO
versionColumnNamePattern エンティティのプロパティに@Versionを付与するカラム名の正規表現です。大文字小文字の違いは考慮されません。 "VERSION([_]?NO)?" NO
entitySuperclassName エンティティクラスのスーパークラスの完全修飾名です。スーパークラスに@MappedSuperclassが指定されている場合スーパークラスに定義されたプロパティと同じ名前のプロパティはエンティティクラスに出力されません。スーパークラスはクラスパス上に存在する必要があります。 - NO
idGeneration 識別子を生成する方法です。"auto", "identity", "sequence", "table", "assigned" のいずれかの値を指定できます。使用するRDBMSがサポートしていない場合、"identity"や"sequence"を指定するとエラーが発生します。この指定は、エンティティに対応するテーブルが単一の主キーを持つ場合にのみ有効です。複数の主キーがある場合は、"assigned"が適用されます。 "assigned" NO
initialValue 識別子の初期値です。シーケンスやテーブルを使って採番する場合にのみ使用されます。指定しない場合は、@SequenceGeneratorや@TableGeneratorのデフォルト値が使用されます。 - NO
allocationSize 識別子の割り当てサイズです。シーケンスやテーブルを使って採番する場合にのみ使用されます。指定しない場合は、@SequenceGeneratorや@TableGeneratorのデフォルト値が使用されます。 - NO
pluralFormFile @OneToManyの関連プロパティ名を複数形で作成する際に使用される辞書ファイルです。 - NO
useTemporalType "true"の場合、日付型カラムに対応するプロパティの型を@Temporalつきのjava.util.Dateとします。"false"の場合、日付型カラムに対応するプロパティの型をjava.sql.Date、java.sql.Time、java.sql.Timestampのいずれかにします。ただし、例外としてOracle DatabaseのDATE型は常に@Temporal(TeporalType.TIMESTAMP)つきのjava.util.Dateにマッピングします。 "false" NO
useAccessor "true"の場合、生成するエンティティにアクセサメソッドを付与します。 "false" NO
applyDbCommentToJava "true"の場合、データベースに対するコメントをエンティティのJavaDocコメントに適用します。テーブルへのコメントはクラスのJavaDocコメントに反映され、カラムへのコメントはプロパティのJavaDocコメントに反映されます。 "false" NO
showCatalogName "true"の場合、@Tableのcatalog属性にカタログ名を明記します。 "false" NO
showSchemaName "true"の場合、@Tableのschema属性にスキーマ名を明記します。 "false" NO
showTableName "true"の場合、@Tableのname属性にテーブル名を明記します。 "false" NO
showColumnName "true"の場合、@Columnのname属性にカラム名を明記します。 "false" NO
showColumnDefinition "true"の場合、@ColumnのcolumnDefinition属性にカラム定義を明記します。 "false" NO
showJoinColumn "true"の場合、@JoinColumnを明記します。 "false" NO
entityTemplateFileName エンティティクラスのテンプレートファイル名です。 "java/entity.ftl" NO
templateFileEncoding テンプレートファイルのエンコーディングです。 "UTF-8" NO
templateFilePrimaryDir テンプレートファイルを検索する際の優先ディレクトリです。 - NO
rootPackageName ルートパッケージ名です。 "" NO
entityPackageName エンティティクラスのパッケージ名です。エンティティクラスは、rootPackageNameとこの値をピリオドで連結したパッケージに配置されます。 "entity" NO
javaFileDestDir Javaファイルの出力先ディレクトリです。 "src/main/java" NO
javaFileEncoding Javaファイルのエンコーディングです。 "UTF-8" NO
overwrite "true"の場合、エンティティクラスのJavaファイルを上書きします。 "false" NO
genDialectClassName S2JDBC-Genのダイアレクトインタフェースの実装クラス名です。ここに指定するクラスはorg.seasar.extension.jdbc.gen.dialect.GenDialectインタフェースを実装している必要があります。指定しない場合はS2JDBCのダイアレクト に対応したデフォルトのクラスが使用されます。 - NO
configPath JdbcManagerのコンポーネント定義を含む設定ファイルです。このタスクの実行に使用されます。 "s2jdbc.dicon" NO
env 環境名です。 "ut" NO
jdbcManagerName JdbcManagerのコンポーネント名です。接続先のデータベースは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のドキュメントを参照してください。

エンティティクラスに共通のスーパークラスを指定する

entitySuperclassName属性に、エンティティクラスに共通のスーパークラスの名前を指定できます。 たとえば、エンティティに対応するすべてのテーブルにCREATE_TIMESTAMPとUPDATE_TIMESTAMPというカラムが定義されている場合、 次のようなクラスを作成し、すべてのエンティティのスーパークラスに指定できます。

@MappedSuperclass
public abstract class AbstractEntity {
    @Temporal(TemporalType.TIMESTAMP)
    public Date createTimestamp;
    @Temporal(TemporalType.TIMESTAMP)
    public Date updateTimestamp;
}

スーパークラス名をGen-EntityタスクのentitySuperclassName属性に指定します。

<gen-entity
    rootPackageName="examples"
    entitySuperclassName="examples.AbstractEntity"
    classpathRef="classpath"
/>

タスクを実行するとexamples.AbstractEntityを継承した次のようなクラスが生成されます。

@Entity
public class Employee extends AbstractEntity {
    @Id
    public Integer id;
    public String name;
}
@Entity
public class Department extends AbstractEntity {
    @Id
    public Integer id;
    public String name;
}

一対多の関連プロパティ名を英単語の複数形にする

一対多の関連プロパティ名は、デフォルトでは、関連先のエンティティ名を小文字にした文字列とListというサフィックスの結合文字列として表されます。

@Entity
public class Department {
    @Id
    public Identity id;
    @OneToManay(mappedBy = "department")
    public List<Employee> employeeList;
}

辞書ファイルを用意することで、英単語の複数形変換のルールに則ることができます。 たとえば、ごく基本的な変換ルールを記述した辞書ファイルは次のようになります。

(.*)(f|fe)$=$1ves
(.*[^aiueo])y$=$1ies
(.*(s|x|sh|ch|o))$=$1es
(.*)$=$1s

辞書ファイルはプロパティファイルの形式で記述します。 行の先頭が「#」や「!」で始まる場合は、コメント行とみなされます。 「=」の左側には関連先エンティティ名の先頭を小文字にした文字列にマッチさせる正規表現を記述します。 「=」の右側には、マッチした場合の置換文字列を記述します。置換文字列には\1や\2などのようにグループの参照を含められます。 辞書ファイルを使った評価は正規表現にマッチするまで上から1行ずつ順に行われます。 どの行にもマッチしない場合、関連プロパティ名は、デフォルトと同様、関連先のエンティティ名を小文字にした文字列とListというサフィックスの結合文字列になります。

辞書ファイルはpluralFormFile属性に指定できます。(ここでは辞書ファイルの名前をplural.propertiesとします。)

<gen-entity
    rootPackageName="examples"
    pluralFormFile="plural.properties"
    classpathRef="classpath"
/>

上記の置換ルールを持つ辞書ファイルを利用した場合、一対多の関連プロパティ名はemployeeListではなくemployeesになります。

@Entity
public class Department {
    @Id
    public Identity id;
    @OneToManay(mappedBy = "department")
    public List<Employee> employees;
}

識別子の生成方法を指定する

識別子の生成方法を指定するには、idGeneration属性に値を指定します。 idGeneration属性に"sequence"や"table"を指定してシーケンスやテーブルでの生成を選択する場合や、 "auto"を指定してシーケンスやテーブルでの生成が自動で選択される場合は、 initialValueやallocationSizeの指定も可能です。 使用するRDBMSがサポートしていない場合、"identity"や"sequence"を指定するとエラーが発生します。

たとえば、テーブルを利用した生成を行う場合、次のように指定できます。

<gen-entity
    rootPackageName="examples"
    idGeneration="table"
    initialValue="1000"
    allocationSize="10"
    classpathRef="classpath"
/>

生成されるクラスは次のようになります。

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "generator")
    @TableGenerator(name = "generator", initialValue = 1000, allocationSize = 10)
    public Identity id;
    public String name;
}

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

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

S2JDBC-Genのテンプレートは、配布ファイルのresources/tempaltesディレクトリ以下にあります。 エンティティクラスのテンプレートはjava/entity.ftlになります。 これをコピーして、修正を加えるのが良いでしょう。 テンプレートの記述方法についてはFreeMarker のドキュメントを参照してください。

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

<gen-entity
    rootPackageName="examples"
    templateFilePrimaryDir="mytempletes"
    classpathRef="classpath"
/>

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

<gen-entity
    rootPackageName="examples"
    templateFilePrimaryDir="mytempletes"
    entityTemplateFileName="my-entity.ftl"
    classpathRef="classpath"
/>

生成するJavaファイルに共通のヘッダーとしてコピーライトを含める

lib.ftlというファイルを作成し、これをtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにcopyrightの定義をします。

<#assign copyright>
/*
 * Copyright 2008-2009 ...
 * All rights reserved.
 */
</#assign>
mytempletes/lib.ftlと配置する場合、タスクの定義は次のようになります。

<gen-entity
    rootPackageName="examples"
    templateFilePrimaryDir="mytempletes"
    classpathRef="classpath"
/>

copyright.ftlにコピーライトを記述することもできます(過去バージョンとの互換機能として残されています)。 copyright.ftlを使う場合は、#assignタグを使わずコピーライトのみを指定してください。 lib.ftlと同様、copyright.ftlはtemplateFilePrimaryDir属性に指定するディレクトリに配置する必要があります。

生成するJavaファイルにauthorを指定する

lib.ftlというファイルを作成し、これをtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにauthorの定義をします。

<#assign author="Nakamura">
mytempletes/lib.ftlと配置する場合、タスクの定義は次のようになります。

<gen-entity
    rootPackageName="examples"
    templateFilePrimaryDir="mytempletes"
    classpathRef="classpath"
/>

データベース上のテーブルやカラムへのコメントをエンティティのJavaDocコメントに反映させる

テーブルやカラムへのコメントをエンティティのJavaDocコメントに反映させるには、applyDbCommentToJava属性に"true"を指定します。

<gen-entity
    rootPackageName="examples"
    applyDbCommentToJava="true"
    classpathRef="classpath"
/>

テーブルやカラムへのコメントをサポートしていないRDBMSの場合、JavaDocコメントへの反映は行われません。 また、MySQLでは、テーブルに対するコメントはJavaDocコメントへ反映されません。