開発時に、開発したEntityの動作を確認するために、以下のテーブル自動生成機能を提供しています。
テーブルの自動生成機能
モジュールの配備時にEntityに対応するテーブルを生成します。
テーブルの自動再生成機能
モジュールの再配備時にEntityに対応するテーブルを再生成します。
テーブル生成と削除のDDL(データ定義命令)をファイルに書き込む機能
モジュールの配備時にテーブル生成と削除のDDLをファイルに書き込みます。このファイルに書き込まれたDDLを基にDBMSのツールによりユーザがテーブルを作成できます。
テーブル生成時と削除時にJDBCドライバ経由でテーブル作成命令(CREATE TABLE)、シーケンス作成命令(CREATE SEQUENCE、INSERT INTO SEQUENCE)や外部キー制約追加命令(ALTER TABLE ADD CONSTRAINT)、または制約削除命令(ALTER TABLE DROP CONSTRAINT)、シーケンス削除命令(DROP SEQUENCE)やテーブル削除命令(DROP TABLE)をデータベースに発行します。データベースによるほかの準備がある場合、データベースとJDBCドライバのマニュアルを参照して実施してください。
本機能を使用するには、Interstage Java EE 7 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を発行します。 | |
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) |
値に固定値を指定するプロパティの場合、値は大文字と小文字を区別しません。
javax.persistence.schema-generation.scripts.actionにcreateまたはdrop-and-createを指定した場合、必ずjavax.persistence.schema-generation.scripts.create-targetも指定してください。
javax.persistence.schema-generation.scripts.actionにdropまたはdrop-and-createを指定した場合、必ずjavax.persistence.schema-generation.scripts.drop-targetも指定してください。
テーブル生成とテーブル削除のDDLファイル名は絶対パスまたは相対パスで指定できます。
絶対パスを指定した場合、指定したパスにDDLのファイルを作成します。
相対パスを指定した場合、Interstage Java EE 7 DASサービスのカレントディレクトリからの相対パスで解決されたパスにDDLのファイルを作成します。Interstage Java EE 7 DASサービスのカレントディレクトリは以下の場所になります。SolarisまたはLinuxの場合、「\」を「/」に読み替えてください。
[Java EE 7共通ディレクトリ]\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") |
Entityの永続化フィールドに対応するDBMSカラムのSQLデータ型を定義しない場合は、DBMSによる以下のデフォルトが使用されます。
Javaのデータ型 | DBMSのSQLデータ型 | ||||
---|---|---|---|---|---|
Oracle | SQL Server | Symfoware Server (Nativeインタフェース) | PostgreSQLベースのデータベース | Java DB | |
boolean | NUMBER(1) | BIT | SMALLINT | BOOLEAN | SMALLINT |
byte | NUMBER(3) | SMALLINT | SMALLINT | SMALLINT | SMALLINT |
char | CHAR(1) | CHAR(1) | CHARACTER(1) | CHAR(1) | CHAR(1) |
short | NUMBER(5) | SMALLINT | SMALLINT | SMALLINT | SMALLINT |
int | NUMBER(10) | INTEGER | INTEGER | INTEGER | INTEGER |
long | NUMBER(19) | NUMERIC(19) | NUMERIC(18) | BIGINT | BIGINT |
float | NUMBER(19,4) | FLOAT(16) | NUMERIC(18,4) | FLOAT | FLOAT |
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) |