この章では、リレーショナル・プロジェクトの概要を説明し、このようなプロジェクトのリレーショナル・データ・タイプおよびオブジェクト・リレーショナル・データ・タイプのデータベースに対する作成について重点を置いて説明します。
複数のタイプのTopLinkプロジェクトに共通のプロジェクトの概念と機能の詳細は、第15章「プロジェクトの概要」を参照してください。
従来型のリレーショナル・データベース、またはオブジェクト・ストレージに特化されたデータ・タイプをサポートするオブジェクト・リレーショナル・データ・タイプ・データベースに対するJavaオブジェクトのトランザクション永続性を実現するために、リレーショナル・プロジェクトを使用します。これらのデータベースは両方ともJDBCを使用してアクセスされます。
注意: TopLink Workbenchを使用している場合、TopLink WorkbenchクラスパスにJDBCドライバを追加する必要があります。TopLink WorkbenchおよびXMLType へ直接マッピング(27.4項「XMLタイプへ直接マッピング」を参照)を使用している場合、TopLink WorkbenchクラスパスにOracleデータベースxdb.jar ファイルを追加する必要があります。
詳細は、5.2項「TopLink Workbench環境の構成」を参照してください。 |
リレーショナル・プロジェクトでは、TopLinkの問合せおよび式を十分に活用できます(第XXIV部「問合せ」を参照)。
Oracle JDeveloper TopLinkエディタおよびTopLink Workbenchは、JDBCを使用してアクセスされる従来型のリレーショナル・データベースにJavaオブジェクトをマップするリレーショナル・プロジェクトの作成を完全にサポートします。
表18-1は、リレーショナル・データベース用リレーショナル・プロジェクトのコンポーネントを示します。
表18-1 リレーショナル・データベース用リレーショナル・プロジェクトのコンポーネント
コンポーネント | サポートされているタイプ |
---|---|
データ・ソース |
詳細は、次を参照してください。 |
ディスクリプタ |
詳細は、21.1項「リレーショナル・ディスクリプタ」を参照してください。 |
マッピング |
詳細は、次を参照してください。 |
詳細は、第19章「リレーショナル・プロジェクトの作成」を参照してください。
Oracle JDeveloper TopLinkエディタおよびTopLink Workbenchは、現在、オブジェクト・リレーショナル・データ・タイプ・データベース用リレーショナル・プロジェクトをサポートしていません。オブジェクト・リレーショナル・データベース用リレーショナル・プロジェクトはJavaで作成する必要があります。
Javaを使用して、オブジェクト・ストレージ用に特化されたデータ・タイプをサポートする、JDBCを使用してアクセスされるオブジェクト・リレーショナル・データ・タイプ・データベースに対するJavaオブジェクトのトランザクション永続性を可能にする、リレーショナル・プロジェクトを作成できます。
TopLinkを使用してオブジェクト・リレーショナル・データ・タイプ・データベース用リレーショナル・プロジェクトを作成する場合、次のことに注意します。
構造型(Struct/object-type
)ごとにJavaクラスとTopLink ObjectRelationalDescriptor
を作成する必要があります。
TopLinkがサポートするのは、基本タイプの配列(Varrays
)または構造型(Struct/object-type
)の配列のみです。
TopLinkは、Refs
の配列、ネストした表の配列はサポートしません。
TopLinkは、Refs
のネストした表のみサポートします。
TopLinkは、基本タイプ、構造型または配列タイプのネストした表はサポートしません。
オブジェクト・リレーショナル・データ・タイプ・データベース用リレーショナル・プロジェクトを作成する際の一般的な開発プロセスは、次のとおりです。
データベースに構造型のオブジェクト・タイプを定義します。
データベースに構造型のオブジェクト・タイプの表を定義します。
構造型のオブジェクト・タイプにマップするJavaクラスを定義します。
リレーショナル・プロジェクトを作成します(第116章「プロジェクトの作成」を参照)。
各Javaクラスに対して、オブジェクト・リレーショナル・データ・タイプ・ディスクリプタを作成します(25.2項「オブジェクト・リレーショナル・データ・タイプ・ディスクリプタの作成」を参照)。
各Javaクラスの永続フィールドからそれに対応するオブジェクト・タイプおよびオブジェクト・タイプ表へのオブジェクト・リレーショナル・データ・タイプ・マッピングを作成します。
詳細は、次を参照してください。
表18-2は、オブジェクト・リレーショナル・データ・タイプ・データベース用リレーショナル・プロジェクトのコンポーネントを示します。
表18-2 オブジェクト・リレーショナル・データ・タイプ・データベース用リレーショナル・プロジェクトのコンポーネント
コンポーネント | サポートされているタイプ |
---|---|
データ・ソース |
詳細は、次を参照してください。 |
ディスクリプタ |
詳細は、24.1項「オブジェクト・リレーショナル・データ・タイプ・ディスクリプタ」を参照してください。 |
マッピング |
詳細は、次を参照してください。 |
詳細は、第19章「リレーショナル・プロジェクトの作成」を参照してください。
リレーショナル・プロジェクトでは、アプリケーションの永続オブジェクトは、インスタンス化されたオブジェクトのクラスを表すデータベース表に格納します。図18-1に示されるように、VEHICLE_POOL表の各行は、そのクラスからのインスタンス化されたオブジェクトを表し、VEH_ID列には各オブジェクトの主キーが保持されます。
プロジェクト・レベルまたはセッション・レベルでTopLinkの順序付けを構成し(20.3項「プロジェクト・レベルでの順序付けの構成」または98.4項「セッション・レベルでの順序付けの構成」を参照)、主キー列の値を取得する方法、つまり使用する順序付けのタイプ(18.2.2項「順序付けタイプ」を参照)をTopLinkに指示します。
ディスクリプタ・レベルでTopLinkの順序付けを構成し(23.3項「ディスクリプタ・レベルでの順序付けの構成」を参照)、ディスクリプタの参照クラスのインスタンスが作成される際に順序値を書き込む表および列をTopLinkに指示します。
この項の内容は次のとおりです。
Oracle JDeveloper TopLinkエディタ、TopLink WorkbenchまたはJavaのいずれかを使用して、順序付けを構成できます。
順序付けを構成するにはOracle JDeveloperの使用をお薦めします。Oracle JDeveloperを使用すると、ほとんどのアプリケーションに適用できる順序付けオプションを簡単に構成できます。詳細は、20.3項「プロジェクト・レベルでの順序付けの構成」または98.4項「セッション・レベルでの順序付けの構成」を参照してください。
TopLink Workbenchを使用して、順序付けが必要なすべてのディスクリプタに適用される単一の事前割当てサイズで1つの順序を作成します。表の順序付け(18.2.2.1項「表の順序付け」を参照)またはネイティブ順序付け(18.2.2.5項「Oracleデータベース・プラットフォームによるネイティブ順序付け」を参照)を構成できます。表の順序付けを選択する場合、デフォルトの表名と列名を使用するか、または独自に指定できます(18.2.2.1.1項「デフォルト表対カスタム順序表」を参照)。
Javaを使用する場合、TopLinkがサポートしている任意の順序タイプを構成できます(18.2.2項「順序付けタイプ」を参照)。プロジェクトごとに順序を任意の数および組合せで作成できます。明示的に順序オブジェクトを作成することや、プラットフォームのデフォルト順序を使用することが可能です(18.2.2.4項「デフォルトの順序付け」を参照)。同じ順序を複数のディスクリプタに関連付けるか、異なる順序(および異なる順序タイプ)を様々なディスクリプタに関連付けることができます。各ディスクリプタの順序に別個の事前割当てサイズを構成できます。詳細は、98.4.2項「Javaを使用したセッション・レベルでの順序付けの構成方法」を参照してください。
TopLinkでは次の順序タイプをサポートします。
表の順序付けを使用する場合、プロジェクトの1つ以上の順序付けされたオブジェクトに関する順序付け情報を含む、単一のデータベース表を作成します。TopLinkでは、この表を維持してこれらのオブジェクト・タイプの順序番号を追跡します。
図18-2に示すように、表は順序付けを使用する複数のクラスに関する順序付け情報を含む場合があります。デフォルトの表は、SEQUENCE
という名前で、次の2つの列で構成されます。
SEQ_NAME
: 選択された行が参照するクラス・タイプを指定します。
SEQ_COUNT
: 選択された行で表されるオブジェクトに現在割り当てられている最も大きい順序番号を指定します。
SEQUENCE
表の行は、それぞれの順序オブジェクトを表します。つまり、順序付けにかかわる各クラスに対する順序オブジェクト、または同じ事前割当てプールを活用できるように複数のクラスにまたがる単一の順序オブジェクトです。ディスクリプタ・レベルで順序付けを構成する際(23.3項「ディスクリプタ・レベルでの順序付けの構成」を参照)、クラスに対してSEQ_NAME
を指定します。その名前の行をSEQUENCE
表に追加し、SEQ_COUNT
列の値を0
に初期化します。
新しいクラスのインスタンスが登録されるたびに、TopLinkは必要な順序値を取得します。効率性を高めるため、TopLinkでは事前割当てを使用して、順序値の取得に必要な表へのアクセス数を削減します(18.2.3項「順序付けと事前割当てサイズ」を参照)。
次の2つのいずれかの方法で、データベースにSEQUENCE
表を作成できます。
表の作成には、Oracle JDeveloper TopLinkエディタまたはTopLink Workbenchを使用します。詳細は、5.5.3.4項「データベースでの表の生成」を参照してください。
TopLinkの表作成機能を使用し、手動で表を作成および更新します。詳細は、5.5.3.1項「SQL作成スクリプトの生成」を参照してください。
Oracle JDeveloper、TopLink WorkbenchまたはJavaを使用して、表の順序付けを構成できます。表の順序付けの構成の詳細は、20.3項「プロジェクト・レベルでの順序付けの構成」または98.4項「セッション・レベルでの順序付けの構成」を参照してください。
表の順序付けと類似していますが(18.2.2.1項「表の順序付け」を参照)、単一列表の順序付けでは、プロジェクトの順序付けされたオブジェクトそれぞれに対して別個の順序表を作成します。
図18-3に示すように、順序付けの情報は、順序付けを使用する単一のクラスの表に表示されます。表には任意に名前を付けることができますが、1列のみ(デフォルトで)SEQUENCE
という名前を付けられたものを含む必要があります。
ディスクリプタ・レベルで順序付けを構成する際に、クラスに対して順序名を指定します。これは、単一列表順序表の名前です。図18-3は、Employee
クラスに対する単一列表順序を示します。Employee
クラス・ディスクリプタは、単一列表順序表の名前と一致するようにEMP_SEQ
の順序名を使用して構成されます(23.3項「ディスクリプタ・レベルでの順序付けの構成」を参照)。TopLinkはこの表に1行追加し、SEQUENCE
列の値を1
に初期化します。
新規クラスが作成されるたびに、TopLinkはそのクラスに対応する単一列順序表の単一行から必要な順序値を取得します。効率性を高めるため、TopLinkでは事前割当てを使用して、順序値の取得に必要な表へのアクセス数を削減します(18.2.3項「順序付けと事前割当てサイズ」を参照)。
次の2つの方法のうちいずれかで、データベースに単一列表順序表を作成できます。
表の作成には、Oracle JDeveloper TopLinkエディタまたはTopLink Workbenchを使用します。詳細は、5.5.3.4項「データベースでの表の生成」を参照してください。
TopLinkの表作成機能を使用し、手動で表を作成および更新します。詳細は、5.5.3.1項「SQL作成スクリプトの生成」を参照してください。
現在は、UnaryTableSequence
クラスを使用してJavaで単一列表順序付けの構成のみが可能です(詳細は、98.4.2項「Javaを使用したセッション・レベルでの順序付けの構成方法」を参照)。
問合せの順序付けにより、カスタム読取り(ValueReadQuery
)およびカスタム更新(DataModifyQuery
)、および自分で指定する事前割当てサイズを使用して、順序リソースにアクセスできます。これにより、ストアド・プロシージャを使用して順序付けを実行できるようになり、TopLinkが提供する他の順序付けタイプではサポートされない順序リソースにアクセスできるようになります。
現在は、QuerySequence
クラスを使用してJavaで問合せの順序付けの構成のみが可能です(詳細は、98.4.2.3項「問合せの順序付けの構成」を参照)。
ログインに所有されるプラットフォームは、そのプラットフォーム・タイプに対して適切なデフォルト順序インスタンスを提供する役割を担っています。たとえば、デフォルトでは、DatabasePlatform
により、デフォルトの表および列名を使用して表の順序が提供されます(18.2.2.1項「表の順序付け」を参照)。
このデフォルト順序には、DatasourceLogin
メソッドgetDefaultSequence
を使用して直接、またはDefaultSequence
クラス、プラットフォームのデフォルト順序のラッパーを使用して間接的にアクセスできます。
存在しない順序にディスクリプタを関連付けると、TopLinkランタイムはDefaultSequence
のインスタンスを作成し、このディスクリプタの順序付けを提供します。詳細は、23.3.3.3項「プラットフォームのデフォルト順序の構成」を参照してください。
DefaultSequence
の主な用途は、プロジェクトのデフォルトとは異なる事前割当てサイズを順序で使用可能にすることです。
現在は、Javaでのデフォルト順序付けの使用のみ可能です(詳細は、98.4.2.1項「プラットフォームのデフォルトの順序の使用」を参照)。
Oracleデータベースによるネイティブ順序付けに対するTopLinkのサポートは、表の順序付けと同様です(18.2.2.1項「表の順序付け」を参照)が、TopLinkで表がデータベースに保持されない点が異なります。かわりに、データベースには、順序付けされたオブジェクトの現在の最大番号および事前割当てサイズが格納される順序オブジェクトが含まれます。ディスクリプタ・レベルで構成された順序名は、ディスクリプタの参照クラスに対して順序付けの値を提供する役割を担う順序オブジェクトを識別します。
Oracle JDeveloper、TopLink WorkbenchまたはJavaを使用して、ネイティブ順序付けを構成できます。表の順序付けの構成の詳細は、20.3項「プロジェクト・レベルでの順序付けの構成」または98.4項「セッション・レベルでの順序付けの構成」を参照してください。
OracleのSEQUENCE
オブジェクトは、TopLinkの順序付けと非常に似た方法を実装します。つまり、TopLinkの事前割当てサイズに相当するINCREMENT
構成メンバー、および表の順序付けにおけるTopLinkのSEQUENCE
表のSEQ_COUNT
フィールドに相当するsequence.nextval
構成メンバーを実装します。この実装により、TopLinkでは、OracleのSEQUENCE
オブジェクトをTopLinkのSEQUENCE
表のように使用でき、TopLinkで表の作成および保持をする必要性はなくなります。
表の順序付けと同様に、TopLinkは、OracleのSEQUENCE
オブジェクトにsequence.nextval
を増やして、その結果を返すように要求し、使用可能な番号のプールを作成します。Oracleは、値INCREMENT
をsequence.nextval
に加算し、TopLinkはその結果を使用して順序付けプールを作成します。
このプロセスと、表の順序付けにおけるプロセスとの主な相違点は、TopLinkがSEQUENCE
オブジェクトのINCREMENT
構成メンバーを認識していないことです。TopLinkの順序付けおよびOracleのSEQUENCE
オブジェクトは独立して動作します。アプリケーションでの順序付けエラーを回避するには、TopLinkの事前割当てサイズおよびOracleのSEQUENCE
オブジェクトのINCREMENT
を同じ値に設定します。TopLinkが次の順序値を取得する際、前の事前割当てサイズの値を持っているとみなすため、Oracle順序オブジェクトの開始値は事前割当てサイズと等しい必要があります。
データベース管理者(DBA)は、アプリケーションが必要とする順序付けのシリーズごとに、データベースにSEQUENCE
オブジェクトを作成する必要があります。アプリケーションのすべてのクラスに独自の順序が必要な場合、DBAはクラスごとにSEQUENCE
オブジェクトを作成します。複数のクラスに1つの順序を共有させる場合、DBAはこれらのクラスに対してSEQUENCE
オブジェクトを1つのみ作成する必要があります。
たとえば、図18-4では、3つのスタイルのテニス・ラケットを製造しているスポーツ用品メーカーの場合を考えてみます。これらのスタイルのラケットのデータは、次のようにデータベースに格納されています。
各スタイルのラケットには、独自のクラス表があります。
製造されるラケットはそれぞれ1つのオブジェクトで、クラス表の1行で表されます。
システムにより、順序付けを使用して、シリアル番号がラケットに割り当てられます。
製造メーカーは、次のいずれかを行うことができます。
ラケットのスタイルごとに異なる順序付けを使用する: DBAは、ATTACK_SEQ
、VOLLEY_SEQ
およびPROX_SEQ
といった名前の3つの異なるSEQUENCE
オブジェクトを作成します。異なるラケットの系列はそれぞれ独自のシリアル番号のシリーズを持ち、系列間ではシリアル番号の重複が発生することもあります(3つのスタイルすべてにシリアル番号1234のラケットがあるなど)。
1つの順序のシリーズをすべてのラケットに対して使用する: DBAは、RACQUET_SEQ
といった名前のSEQUENCE
オブジェクトを1つ作成します。メーカーは、ラケットのスタイルに関係なく、製造したラケットにシリアル番号を割り当てます。
データベースには、データベース管理システムによって順序番号が生成される、一種のネイティブ順序付けをサポートするものがあります。
ネイティブ順序付けを使用するクラスについてデータベース表を作成する際は、主キー列を含め、次のように列のタイプを設定します。
Sybase SQL ServerおよびMicrosoft SQL Serverデータベースの場合、主キー・フィールドをタイプIDENTITY
に設定します。
IBM Informixデータベースの場合、主キー・フィールドをタイプSERIAL
に設定します。
IBM DB2データベースの場合、主キー・フィールドをタイプIDENTITY
に設定します。
新規オブジェクトを表に挿入する場合、TopLinkは、そのオブジェクトを表に挿入する前に移入しますが、順序番号を含めません。データベースが、そのオブジェクトを表に挿入するときに、前のオブジェクトの主キーに1
を加えた値を主キー・フィールドに自動的に移入します。
この時点で、トランザクションが終了する前に、TopLinkは、TopLinkのキャッシュにあるアイデンティティを持つように、新規オブジェクトの主キーを読み取りなおします。
注意: このタイプの順序付けは事前割当てをサポートしないため、事前割当てサイズを1に設定する必要があります。順序の事前割当ての利点を活用するには、これらのデータベースにはネイティブ順序付けではなく表の順序付けの使用をお薦めします。 |
データベースがネイティブ順序付けを提供していても、TopLinkがそれを直接サポートしない場合は、問合せ順序およびストアド・プロシージャを使用してネイティブ順序オブジェクトにアクセスできる場合があります。詳細は、18.2.2.3項「問合せの順序付け」を参照してください。
Oracle JDeveloper、TopLink WorkbenchまたはJavaを使用して、ネイティブ順序付けを構成できます。表の順序付けの構成の詳細は、20.3項「プロジェクト・レベルでの順序付けの構成」または98.4項「セッション・レベルでの順序付けの構成」を参照してください。
順序付けの効率性を高めるため、TopLinkでは順序番号を事前に割り当てることができます。事前割当てにより、TopLinkでは、新規オブジェクトが作成され、データベースに挿入されるときに割り当てられる使用可能な順序番号のプールを作成できます。TopLinkは、プールが空になるまで、順序プールから番号を割り当てます。
事前割当てサイズは、使用可能な番号のプールのサイズを指定します。事前割当てにより、順序付けに必要なデータベースへのアクセス回数が大幅に減少し、順序付けの効率は高まります。デフォルトでは、TopLinkは事前割当てサイズを50
に設定します。事前割当てサイズはOracle JDeveloper TopLinkエディタまたはTopLink Workbenchで、あるいはセッション・ログインの一部として指定できます。
事前割当てサイズの構成は、表の順序付けおよびOracleネイティブ順序付けに適用されます。Oracleネイティブ順序付けでは、順序の事前割当てサイズはOracle順序オブジェクトの増分サイズと一致する必要があります。他のデータベースでは自動割当て順序列を使用するため、他のデータベースでのネイティブ順序付けには事前割当てを利用できません。事前割当てを使用できるようにするため、Oracle以外のデータベースでは表の順序付けの使用をお薦めします。
表の順序付けの場合、TopLinkは順序付けされたクラスごとに事前に割り当てられた値のプールを保持します。TopLinkは、この値のプールが空になると、次のように新しい値のプールを確保します。
TopLinkはデータベースにアクセスし、(SEQ_NAME
によって識別される)特定のクラスに対するSEQ_COUNT
を事前割当てサイズだけ増やし、その結果を返すように要求します。
たとえば、図18-2のSEQUENCE
表を考えてみます。新しい発注書が作成され、TopLinkの順序番号のプールが空になった場合、TopLinkはSQL文を実行し、SEQ_PURCH_ORDER
のSEQ_COUNT
を事前割当てサイズ(この場合、TopLinkのデフォルトの50
)だけ増やします。データベースはSEQ_PURCH_ORDER
のSEQ_COUNT
を1600
に増やし、この数値をTopLinkに返します。
TopLinkは、新しい順序番号のプールについて最大値および最小値を計算し、値のプールを作成します。
TopLinkは、オブジェクト・シーケンス属性にプールの最初の番号を移入し、オブジェクトをクラス表に書き込みます。
新しいオブジェクトがクラス表に追加されると、TopLinkはプールが空になるまで、プールから値を割り当て続けます。プールが空になると、TopLinkは再び新しい値を表に要求します。
Oracle JDeveloper TopLinkエディタおよびTopLink Workbenchを使用する場合、プロジェクト・レベルまたはセッション・レベルで順序付けのタイプを選択する際に、事前割当てサイズを指定します。事前割当てサイズは、すべてのディスクリプタに適用されます。
Javaを使用すると、作成するそれぞれの順序に別個の事前割当てサイズを指定できます。
事前割当てサイズの構成の詳細は、20.3項「プロジェクト・レベルでの順序付けの構成」または98.4項「セッション・レベルでの順序付けの構成」を参照してください。
コンテナ管理の永続性を備えたエンティティBeanに対する順序付けを実装するには、表の順序付けやOracleネイティブ順序付けなどの事前割当てを実装する方法を使用します。事前割当てにより、エンティティBeanの主キーはejbPostCreate
メソッドで必ず使用できます。Oracle以外のネイティブ順序付けを使用する場合(たとえば、Sybase、Microsoft SQL ServerまたはInformixデータベースのネイティブ順序付け)、次の点に注意してください。
Oracle以外のネイティブ順序付けは、オブジェクトを作成するトランザクションがコミットされるまで、作成されたオブジェクトの主キーを初期化しないため、厳密にはEJB仕様に準拠していません。3.0より前のEJB仕様では、主キーがejbPostCreate
メソッドで使用できると想定しています。
OC4Jでは、ネイティブ順序付けをサポートします。ただし、この種のネイティブ順序付けは、オブジェクトが作成されるトランザクションがコミットされるまで、作成されたオブジェクトの主キーを割り当てたり、返すことをしません。このため、ネイティブ順序付けを使用する場合は、ejbCreate
メソッドのコール後すぐにトランザクションをコミットし、TopLinkのキャッシュおよびコンテナにあるオブジェクト・アイデンティティに関する問題を回避するようにします。