ページの先頭行へ戻る
Interstage Application Server V13.0.0 GlassFish 設計・構築・運用ガイド
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ドライバのマニュアルを参照して実施してください。

本機能を使用するには、DASにJDBCドライバの環境設定を行い、deployment descriptor (persistence.xml)のプロパティ定義を使用します。
JDBCドライバの環境設定方法については「4.14.1 JDBCドライバの環境設定」を参照してください。


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

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

説明

javax.persistence.schema-generation.database.action

create

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

drop

テーブル削除のDDLをデータベースへ発行します。テーブルがすでに存在しない場合、テーブルを削除せずに配備を継続します。

drop-and-create

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

none (省略値)

テーブル生成と削除のDDLをデータベースへ発行しません。

javax.persistence.schema-generation.scripts.action

create

テーブル生成のDDLをファイルに書き込みます。 (注1)

drop

テーブル削除のDDLをファイルに書き込みます。 (注2)

drop-and-create

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

none (省略値)

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

javax.persistence.schema-generation.scripts.create-target

<ファイル名>

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

javax.persistence.schema-generation.scripts.drop-target

<ファイル名>

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

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

1)

javax.persistence.schema-generation.scripts.actionにcreateまたはdrop-and-createを指定した場合、必ずjavax.persistence.schema-generation.scripts.create-targetも指定してください。

注2)

javax.persistence.schema-generation.scripts.actionにdropまたはdrop-and-createを指定した場合、必ずjavax.persistence.schema-generation.scripts.drop-targetも指定してください。

注3)

テーブル生成とテーブル削除のDDLファイル名は絶対パスまたは相対パスで指定できます。

絶対パスを指定した場合、指定したパスにDDLのファイルを作成します。

相対パスを指定した場合、DASのカレントディレクトリーからの相対パスで解決されたパスにDDLのファイルを作成します。DASのカレントディレクトリーは以下の場所になります。SolarisまたはLinuxの場合、「\」を「/」に読み替えてください。

  • [運用資産格納ディレクトリー]\domains\domain1\current

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

テーブル生成とテーブル削除のDDLファイルを出力するディレクトリーは配備前に作成してください。


テーブル自動生成定義例

  <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://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
               version="2.1">
    <persistence-unit name="com.company.my.pu">
      <jta-data-source>jdbc/myDatasource</jta-data-source>
      <properties>
        <property name="javax.persistence.schema-generation.database.action"
                  value="drop-and-create"/>
        <property name="javax.persistence.schema-generation.scripts.action"
                  value="drop-and-create"/>
        <property name="javax.persistence.schema-generation.scripts.create-target"
                  value="myds-create-ddl.sql"/>
        <property name="javax.persistence.schema-generation.scripts.drop-target"
                  value="myds-drop-ddl.sql"/>
      </properties>
    </persistence-unit>
  </persistence>

注意

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

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

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

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

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

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

  • アプリケーションでjavax.persistence.PersistenceインターフェイスのcreateEntityManagerFactoryメソッドを呼び出してEntity Manager Factoryを取得する場合、データベーステーブル自動生成機能は、配備時ではなくEntity Manager Factory生成時に実行されます。この際、テーブル生成と削除のDDLファイル名に相対パスを指定した場合のDDLの格納先はJVMのカレントディレクトリーからの相対パスになります。

  • Symfoware ServerのNativeインターフェイスを使用する場合、プライマリキーもしくは一意性制約キーのカラムに対してインデックスが自動生成されます。インデックス名は以下となります。
    IX_テーブル名_識別子
    テーブル名にはJPAが対象とするテーブル名が指定され、識別子にはカラム名から生成した識別子が指定されます。また、Symfowareのテーブル名には 空白、「"」、「`」 を含めることはできません。含めた場合、テーブル/インデックスの自動生成に失敗します。
    このルールで生成されたインデックス名が36文字を超過する場合には、36文字を超えないようにインデックス名が変換("IX_"を付与しないなど)されます。Symfowareのインデックス名は通常は8文字以内ですが、システム用の動作環境ファイルでDEFAULT_DSI_NAME=CODEを指定することで拡張できます。インデックス名の制限についてはSymfoware Serverのマニュアルを参照してください。
    使用されたインデックス名を確認する場合には、データベーステーブル自動生成機能により作成されるDDLファイルを参照してください。

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

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


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

Javaのデータ型

DBMSのSQLデータ型

Oracle

SQL Server

Symfoware Server (Nativeインターフェイス)

PostgreSQLベースのデータベース

Java DB

boolean
java.lang.Boolean

NUMBER(1)
default 0

BIT
default 0

SMALLINT
default 0

BOOLEAN

SMALLINT
DEFAULT 0

byte
java.lang.Byte

NUMBER(3)

SMALLINT

SMALLINT

SMALLINT

SMALLINT

char
java.lang.Character

CHAR(1)

CHAR(1)

CHARACTER(1)

CHAR(1)

CHAR(1)

short
java.lang.Short

NUMBER(5)

SMALLINT

SMALLINT

SMALLINT

SMALLINT

int
java.lang.Integer

NUMBER(10)

INTEGER

INTEGER

INTEGER

INTEGER

long
java.lang.Long

NUMBER(19)

NUMERIC(19)

NUMERIC(18)

BIGINT

BIGINT

float
java.lang.Float

NUMBER(19,4)

FLOAT(16)

NUMERIC(18,4)

FLOAT

FLOAT

double
java.lang.Double

NUMBER(19,4)

FLOAT(32)

NUMERIC(18,4)

FLOAT

FLOAT

java.lang.String

VARCHAR2(255)

VARCHAR(255)

VARCHAR(255)

VARCHAR(255)

VARCHAR(255)

java.math.BigDecimal

NUMBER(38)

NUMERIC(28)

DECIMAL(18)

DECIMAL(38)

DECIMAL

java.math.BigInteger

NUMBER(38)

NUMERIC(28)

NUMERIC(18)

BIGINT

BIGINT

java.sql.Date

DATE

DATETIME

DATE

DATE

DATE

java.sql.Time

TIMESTAMP

DATETIME

TIME

TIME

TIME

java.sql.Timestamp

TIMESTAMP

DATETIME

TIMESTAMP

TIMESTAMP

TIMESTAMP

java.util.Date

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

java.util.Calendar

byte[]

BLOB

IMAGE

BLOB(1024)

BYTEA

BLOB(64000)

java.lang.Byte[]

BLOB

IMAGE

BLOB(1024)

BYTEA

BLOB(64000)

char[]

CLOB

TEXT

VARCHAR(255)

TEXT

CLOB(255)

java.lang.Character[]

CLOB

TEXT

VARCHAR(255)

TEXT

CLOB(255)

enum(ordinal)

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

enum(String)

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

Serializableオブジェクト

BLOB

IMAGE

BLOB(1024)

BYTEA

BLOB(64000)

(LOB)byte[]

BLOB

IMAGE

BLOB(1024)

BYTEA

BLOB(64000)

(LOB)java.lang.Byte[]

BLOB

IMAGE

BLOB(1024)

BYTEA

BLOB(64000)

(LOB)Serializableオブジェクト

BLOB

IMAGE

BLOB(1024)

BYTEA

BLOB(64000)

(LOB)char[]

CLOB

TEXT

VARCHAR(32000)

TEXT

CLOB(64000)

(LOB)java.lang.Character[]

CLOB

TEXT

VARCHAR(32000)

TEXT

CLOB(64000)

(LOB)java.lang.String

CLOB

TEXT

VARCHAR(32000)

TEXT

CLOB(64000)