ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server Express Java EE運用ガイド
FUJITSU Software

2.11.6 データベーステーブル自動生成機能

開発時に、開発したEntityの動作を確認するために、以下のテーブル自動生成機能を提供しています。

テーブル生成時と削除時にJDBCドライバ経由でテーブル作成命令(CREATE TABLE)、シーケンス作成命令(CREATE SEQUENCE、INSERT INTO SEQUENCE)や外部キー制約追加命令(ALTER TABLE ADD CONSTRAINT)、または制約削除命令(ALTER TABLE DROP CONSTRAINT)、シーケンス削除命令(DROP SEQUENCE)やテーブル削除命令(DROP TABLE)をデータベースに発行します。データベースによるほかの準備がある場合、データベースとJDBCドライバのマニュアルを参照して実施してください。

本機能を使用するには、Interstage Java EE DASサービスにJDBCドライバの環境設定を行い、deployment descriptor (persistence.xml)のプロパティ定義またはasadminコマンドのdeployとundeployサブコマンドのテーブル生成オプションを使用します。
JDBCドライバの環境設定方法については「4.16.1 JDBCドライバの環境設定」を参照し、asadminコマンドのdeployサブコマンドとundeployサブコマンドのオプションについては、「リファレンスマニュアル(コマンド編)」-「asadminコマンド」-「サブコマンド-カテゴリ: アプリケーション配備」を参照してください。


deployment descriptor (persistence.xml)に指定するプロパティを以下に示します。

永続性ユニットプロパティ名

値(太字:省略値)

説明

toplink.ddl-generation

create-tables

テーブル生成のDDLをデータベースへ発行します。テーブルがすでに存在する場合、警告を出力し既存テーブルを変更せずに配備を継続します。

drop-and-create-tables

再配備の場合は、テーブル削除のDDLをデータベースへ発行してからテーブル生成のDDLを発行します。
新規配備の場合は、テーブル生成のDDLだけをデータベースへ発行します。

none

toplink.ddl-generation.output-modeを定義してもテーブルとDDLを生成しません。

toplink.ddl-generation.output-mode

sql-script

テーブル生成と削除のDDLをファイルに書き込みます。

database

テーブル生成と削除のDDLをファイルに書き込んでデータベースへ発行します。

both(注1)

none

toplink.ddl-generationを定義してもテーブルとDDLを生成しません。

toplink.application-location

<パス>

DDLファイルの格納先です。発行されるDDLを確認したい場合は指定してください。 (注2)

toplink.create-ddl-jdbc-file-name

<ファイル名>

テーブル生成のDDLのファイル名です。 (注3)

toplink.drop-ddl-jdbc-file-name

<ファイル名>

テーブル削除のDDLのファイル名です。 (注4)

値に固定値を指定するプロパティの場合、値は大文字と小文字を区別しません。

1)

toplink.ddl-generation.output-modeはsql-script、database、both、none以外の値を設定する場合、設定値が無視されて、デフォルトのbothになります。

注2)

省略した場合は、以下のとおりになります。SolarisまたはLinuxの場合、「\」を「/」に読み替えてください。

配備モジュール内のpersistence.xmlの格納場所

DDLファイルのデフォルトの格納先

EJB-JARまたはWARファイル内

[Java EE共通ディレクトリ]\domains\interstage\generated\ejb\j2ee-modules\[アプリケーション名]

EARに含むEJB-JARまたはWARファイル内

[Java EE共通ディレクトリ]\domains\interstage\generated\ejb\j2ee-apps\[アプリケーション名]

EARに含むライブラリなど、その他

[Java EE共通ディレクトリ]\domains\interstage\generated\ejb\j2ee-apps\[アプリケーション名]

3)

省略した場合は、以下のとおりになります。 (注5)

  • [モジュール名] + "_" + [永続性ユニット名] + "_createDDL.jdbc"

4)

省略した場合は、以下のとおりになります。 (注5)

  • [モジュール名] + "_" + [永続性ユニット名] + "_dropDDL.jdbc"

5)

モジュール名は、以下のようにアプリケーションの配備時にdeployment descriptor (persistence.xml)が格納される場所によります。永続性ユニット名は、deployment descriptor (persistence.xml)に指定したpersistence-unitの名前を指しています。

配備モジュール内のpersistence.xmlの格納場所

DDLファイル名に使用するモジュール名

EJB-JARまたはWARファイル内

EJB-JARまたはWARファイル名(拡張子を除く)

EARに含むEJB-JARまたはWARファイル内

EARファイル名+[_]+EJB-JARまたはWARファイル名(両方拡張子を除く)

EARに含むライブラリなど、その他

「default」


テーブル自動生成定義例

  <persistence xmlns="http://java.sun.com/xml/ns/persistence"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                  http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
               version="1.0">
    <persistence-unit name="com.company.my.pu">
      <jta-data-source>jdbc/myDatasource</jta-data-source>
      <properties>
        <property name="toplink.ddl-generation"
                  value="drop-and-create-tables"/>
        <property name="toplink.ddl-generation.output-mode"
                  value="sql-script"/>
        <property name="toplink.application-location"
                  value="/tmp/ddl"/>
        <property name="toplink.create-ddl-jdbc-file-name"
                  value="myds-create-ddl.sql"/>
        <property name="toplink.drop-ddl-jdbc-file-name"
                  value="myds-drop-ddl.sql"/>
      </properties>
    </persistence-unit>
  </persistence>

注意

データベーステーブル自動生成機能に関する注意事項

  • テーブルの自動生成先は、デフォルトのデータベーススペース(Oracleでは表領域/SQL Serverではプライマリファイルグループ)上となります。Symfowareの場合はデフォルトのデータベーススペースが存在しないため、データベース名と同名のデータベーススペース(手動で作成が必要)上に作成されます。

  • 自動生成したテーブル、またはテーブルのDDLは開発環境用です。運用環境では、データベース管理者が用意したテーブルを使用してください。

  • Symfowareを使用する場合、自動生成されたプライマリキーのカラムに対してインデックスが自動的に作成されます。また、その他の一意性制約キーのカラムに対してもインデックスが自動生成されます。

  • Symfowareのデーターベース簡単運用を使用する場合、プライマリキーのカラムのインデックスや一意性制約キーのカラムのインデックスはSymfowareで自動的に作成されます。このため、配備時のテーブル作成処理中にインデックスのDSOと同じ列の構成を指定したインデックスのDSOがすでに定義されているという警告が出力します。この場合、Symfowareで自動的に設定されたインデックスを利用するため問題ありません。Symfowareデーターベース簡単運用で設定されるインデックスについてはSymfowareのマニュアルを参照してください。

  • Symfowareのデーターベース簡単運用を使用する場合、テーブル削除処理を行うと、そのテーブルのプライマリキーのカラムのインデックスや一意性制約キーのカラムのインデックスはSymfowareで自動的に削除されます。このため、配備解除時のデータベーステーブル削除処理中に指定されたインデックスは定義されていないという警告が出力します。この場合、Symfowareで自動的に設定されたインデックスはSymfowareが削除を行うため、問題ありません。Symfowareデーターベース簡単運用で削除されるインデックスについてはSymfowareのマニュアルを参照してください。

  • テーブル生成とテーブル削除のDDLファイル名として同じファイル名を指定しないでください。

  • 配備解除時のテーブル削除には、テーブル削除のDDLファイルに格納されているDDLが使用されるため、このファイルを削除すると配備解除時にテーブル削除が失敗しエラーが出力されます。

  • テーブル自動生成機能で作成されるテーブルのスキーマは接続先のデータベースで自動的に設定されます。設定されるスキーマについては各データベースのマニュアルを参照してください。
    ただし、SymfowareではJDBCドライバの環境設定でスキーマ名を指定することで、テーブル自動生成機能で作成されるテーブルのスキーマを設定することが可能です。詳細は「4.16.6 Symfoware ServerのNativeインタフェース JDBCドライバ(Type2)」を参照してください。

  • データベーステーブル自動生成機能を使用して配備時にSymfowareのテーブルを生成する場合、Interstage Java EE DASサービス上のJDBC接続プールの接続を利用してテーブルを生成します。しかし、Symfowareの仕様によりセッション中にアクセスした資源はセッションが終了するまで削除できません。このため、テーブルを生成した接続が接続プールに存在する状態で配備解除によってテーブルを自動的に削除するとき、Symfowareからエラーメッセージが出力されテーブルの削除に失敗する場合があります。この場合には、手動でテーブルを削除してください。セッション中の資源の削除についてはSymfowareのマニュアルを参照してください。

  • アプリケーションでjavax.persistence.PersistenceインタフェースのcreateEntityManagerFactoryメソッドを呼び出してEntity Manager Factoryを取得する場合、データベーステーブル自動生成機能は、配備時ではなくEntity Manager Factory生成時に実行されます。この際、toplink.application-locationプロパティを省略した場合のDDLの格納先はJVMのカレントディレクトリになります。また、toplink.create-ddl-jdbc-file-name プロパティ、またはtoplink.drop-ddl-jdbc-file-name プロパティを省略した場合のDDLファイルのファイル名は以下になります。

    • createDDL.jdbc

    • dropDDL.jdbc

  • アプリケーションでjavax.persistence.PersistenceインタフェースのcreateEntityManagerFactoryメソッドを呼び出してEntity Manager Factoryを取得する場合、配備解除時にテーブルは削除されないため、Entity Manager Factory 生成時作成されたDDLファイルを参照して手動でテーブルを削除してください。

Entityの永続化フィールドに対応するDBMSカラムのSQLデータ型は、以下の例のように定義できます。

@Column(columnDefinition="VARCHAR(128) NOT NULL")
public String name ;


Entityの永続化フィールドに対応するDBMSカラムのSQLデータ型を定義しない場合は、DBMSによる以下のデフォルトが使用されます。

Javaのデータ型

DBMSのSQLデータ型

Symfoware

Oracle

SQL Server

PowerGres Plus

Java DB

boolean
java.lang.Boolean

SMALLINT
default 0

NUMBER(1)
default 0

BIT
default 0

BOOLEAN

SMALLINT
DEFAULT 0

byte
java.lang.Byte

SMALLINT

NUMBER(3)

SMALLINT

SMALLINT

SMALLINT

char
java.lang.Character

CHARACTER(1)

CHAR(1)

CHAR(1)

CHAR(1)

CHAR(1)

short
java.lang.Short

SMALLINT

NUMBER(5)

SMALLINT

SMALLINT

SMALLINT

int
java.lang.Integer

INTEGER

NUMBER(10)

INTEGER

INTEGER

INTEGER

long
java.lang.Long

NUMERIC(18)

NUMBER(19)

NUMERIC(19)

BIGINT

BIGINT

float
java.lang.Float

NUMERIC(18,4)

NUMBER(19,4)

FLOAT(16)

FLOAT

FLOAT

double
java.lang.Double

NUMERIC(18,4)

NUMBER(19,4)

FLOAT(32)

FLOAT

FLOAT

java.lang.String

VARCHAR(255)

VARCHAR2(255)

VARCHAR(255)

VARCHAR(255)

VARCHAR(255)

java.math.BigDecimal

DECIMAL(18)

NUMBER(38)

NUMERIC(28)

DECIMAL(38)

DECIMAL

java.math.BigInteger

NUMERIC(18)

NUMBER(38)

NUMERIC(28)

BIGINT

BIGINT

java.sql.Date

DATE

DATE

DATETIME

DATE

DATE

java.sql.Time

TIME

TIMESTAMP

DATETIME

TIME

TIME

java.sql.Timestamp

TIMESTAMP

TIMESTAMP

DATETIME

TIMESTAMP

TIMESTAMP

java.util.Date

指定したTemporalTypeのマッピングを参照

java.util.Calendar

byte[]

BLOB(1024)

LONG RAW

IMAGE

BYTEA

BLOB(64000)

java.lang.Byte[]

BLOB(1024)

LONG RAW

IMAGE

BYTEA

BLOB(64000)

char[]

VARCHAR(255)

LONG

TEXT

TEXT

CLOB(255)

java.lang.Character[]

VARCHAR(255)

LONG

TEXT

TEXT

CLOB(255)

enum(ordinal)

java.lang.Integerのマッピングを参照

enum(String)

java.lang.Stringのマッピングを参照

Serializableオブジェクト

BLOB(1024)

LONG RAW

IMAGE

BYTEA

BLOB(64000)

(LOB)byte[]

BLOB(1024)

BLOB

IMAGE

BYTEA

BLOB(64000)

(LOB)java.lang.Byte[]

BLOB(1024)

BLOB

IMAGE

BYTEA

BLOB(64000)

(LOB)Serializableオブジェクト

BLOB(1024)

BLOB

IMAGE

BYTEA

BLOB(64000)

(LOB)char[]

VARCHAR(32000)

CLOB

TEXT

TEXT

CLOB(64000)

(LOB)java.lang.Character[]

VARCHAR(32000)

CLOB

TEXT

TEXT

CLOB(64000)

(LOB)java.lang.String

VARCHAR(32000)

CLOB

TEXT

TEXT

CLOB(64000)


JPAのデータベーステーブル自動生成機能でSymfowareを使用する場合、プライマリキーもしくは一意性制約キーのカラムに対してインデックスが自動生成されます。インデックス名は以下となります。


IX_テーブル名_識別子


テーブル名にはJPAが対象とするテーブル名が指定され、識別子にはカラム名から生成した識別子が指定されます。また、Symfowareのテーブル名には 空白、「"」、「`」 を含めることはできません。含めた場合、テーブル/インデックスの自動生成に失敗します。

このルールで生成されたインデックス名が36文字を超過する場合には、36文字を超えないようにインデックス名が変換("IX_"を付与しないなど)されます。Symfowareのインデックス名は通常は8文字以内ですが、システム用の動作環境ファイルでDEFAULT_DSI_NAME=CODEを指定することで拡張できます。インデックス名の制限についてはSymfowareのマニュアルを参照してください。

使用されたインデックス名を確認する場合には、データベーステーブル自動生成機能により作成されるDDLファイルを参照してください。