この章では、リレーショナル・マッピングの構成方法について説明します。
表34-1は、構成可能なリレーショナル・マッピング・タイプと、そのタイプで対応している構成可能オプションが記載されたタイプ別の章への相互参照を示しています。
表34-1 リレーショナル・マッピングの構成
表34-2は、複数のリレーショナル・マッピング・タイプによって共有される構成可能オプションを示します。
詳細は、次を参照してください。
表34-2は、複数のリレーショナル・マッピング・タイプによって共有される構成可能オプションを示します。ここで説明する構成可能オプション以外にも、表34-1に示すように、特定のリレーショナル・マッピングのタイプについて説明しているオプションも構成する必要があります。
表34-2 共通リレーショナル・マッピング・オプション
オプション | タイプ | TopLink Workbench |
Java |
---|---|---|---|
|
基本 |
![]() |
![]() |
|
基本 |
![]() |
![]() |
|
基本 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
基本 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
基本 |
![]() |
![]() |
「プライベート・リレーションシップまたは独立したリレーションシップの構成」 |
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
|
詳細 |
![]() |
![]() |
「表およびフィールド参照の構成(外部キーおよびターゲット外部キー)」 |
詳細 |
![]() |
![]() |
オブジェクト属性をデータベース・フィールドに関連付けることができます。
表34-3では、どのリレーショナル・マッピングがこのオプションをサポートしているかを示します。
データベース・フィールドを選択する際、Javaとデータベース・フィールド・タイプの互換性を考慮する必要があります。
TopLinkは次のJavaタイプをサポートします。
java.lang
: Boolean
、Float
、Integer
、String
、Double
、Long
、Short
、Byte
、Byte[ ]
、Character
、Character[ ]
: すべてのプリミティブはこれらのクラスに関連付けられます。
java.math
: BigInteger
、BigDecimal
java.sql
: Date
、Time
、Timestamp
java.util
: Date
、Calendar
読取りの実行中に、表34-6のマッピングは、表34-4に示す単純な一方向のデータ変換を実行します。双方向またはより複雑な変換の場合は、コンバータを使用する必要があります(「コンバータおよびトランスフォーマ」を参照)。
表34-3のマッピングによって、NULL値を指定することもできます。これは、プリミティブ・タイプがオブジェクトで使用され、データベース・フィールドでnull
値を使用できる場合に必要となることがあります。詳細は、「マッピング・レベルでのデフォルトのNULL値の構成」を参照してください。
Javaタイプ | データベース・タイプ |
---|---|
Integer、Float、Double、Byte、Short、BigDecimal、BigInteger、int、float、double、byte、short |
NUMBER、NUMERIC、DECIMAL、FLOAT、DOUBLE、INT、SMALLINT、BIT、BOOLEAN |
Boolean、boolean |
BOOLEAN、BIT、SMALLINT、NUMBER、NUMERIC、DECIMAL、FLOAT、DOUBLE、INT |
String |
VARCHAR、CHAR、VARCHAR2、CLOB、TEXT、LONG、LONG VARCHAR、MEMO 次のタイプはOracle9のみに適用されます。NVARCHAR2、NCLOB、NCHAR |
byte[ ] |
BLOB、LONG RAW、IMAGE、RAW、VARBINARY、BINARY、LONG VARBINARY |
Time |
TIME |
sql.Date |
DATE(DB2のみに適用) |
TIMESTAMP(DB2のみに適用) |
|
sql.Date、Time、Timestamp、util.Date、Calendar
|
DATE、DATETIME(Oracle、Sybase、SQL Serverに適用) |
oracle.sql.TimeStampのサポート
TopLinkでは、TopLinkでOracle9i Database Server以上およびOracle9Platform
とともにOracle JDBCドライバを使用する場合にJavaの日付および時間のデータ・タイプをOracleデータベースのDATE
、TIMESTAMP
およびTIMESTAMPTZ
データ・タイプにマッピングするための追加サポートを提供します。
フィールドへ直接マッピングでは、フィールド値のデータベース・タイプを指定する必要はありません。TopLinkにより、適切なデータ・タイプ変換が決定されます。
表34-5に、サポートされるフィールドへ直接マッピングの組合せを示します。
表34-5 サポートされるOracleデータベースの日付および時間のフィールドへ直接マッピング
Javaタイプ | データベース・タイプ | 説明 |
---|---|---|
|
|
完全双方向サポート。 |
|
完全双方向サポート。 |
|
|
完全双方向サポート。 |
|
|
|
完全双方向サポート。 |
|
完全双方向サポート。 |
|
|
完全双方向サポート。 |
|
|
|
完全双方向サポート。 |
|
完全双方向サポート。 |
|
|
ナノ秒はデータベースに格納されません。 |
|
|
|
完全双方向サポート。 |
|
完全双方向サポート。 |
|
|
ミリ秒はデータベースに格納されません。 |
|
|
ネイティブSQLまたはバインドが、Calendarタイムゾーンを提供します。 注意: TIMESTAMPデータベース値には、タイムゾーンがありません。デフォルトでは、Calendarオブジェクトがローカルのタイムゾーンを提供します。データベースがこのタイムゾーンにない場合は、別の方法でデータベース・タイムゾーンを取得し、それに応じてCalendarオブジェクトを更新する必要があります。このため、この場合はTIMESTAMPTZの方が適しています。 |
|
|
ネイティブSQLまたはバインドはタイムゾーンを格納し、標準SQLはローカル・タイムゾーンに基づきます。 |
|
|
タイムゾーンとミリ秒はどちらも、データベースに格納されません。 |
前述のマッピングの中には精度が損われるものもあるため、このレベルの精度を求める場合は、これらの組合せを使用しないでください。たとえば、java.sql.Date
属性とTIMESTAMPTZ
データベース・フィールドの間でフィールドへ直接マッピングを作成した場合、精度は損われません。しかし、java.sql.Timestamp
属性とDATE
データベース・フィールドの間でフィールドへ直接マッピングを作成した場合は、属性のナノ秒またはミリ秒がデータベースに格納されません。
ダイレクト・マッピングで特定のデータベース・フィールドを選択するには、次の手順を実行します。
ナビゲータでダイレクト・マッピングの属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
「データベース・フィールド」フィールドを使用して、このダイレクト・マッピングのフィールドを選択します。「関連表の構成」で説明されているように、前もってディスクリプタをデータベース表に関連付けておく必要があります。
oracle.toplink.mappings.ForeignReferenceMapping
の拡張であるリレーショナル・マッピングでは、属性が参照するのはその他のTopLinkディスクリプタであり、データ・ソースではありません。プロジェクトで任意のディスクリプタを選択できます。
表34-6では、どのリレーショナル・マッピングがこのオプションをサポートしているかを示します。
リレーショナル・マッピングに参照ディスクリプタを指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
「参照ディスクリプタ」フィールドを使用して、このリレーションシップ・マッピングで参照するディスクリプタを選択します。
注意: 集約マッピングの場合、「参照ディスクリプタ」は集約である必要があります。詳細は、「クラスまたは集約タイプとしてのリレーショナル・ディスクリプタの構成」を参照してください。可変1対1マッピングの場合、「参照ディスクリプタ」はインタフェースである必要があります。詳細は、第38章「リレーショナル可変1対1マッピングの構成」を参照してください。 |
現行TopLink Workbenchプロジェクトにない参照ディスクリプタを指定できます。たとえば、現行プロジェクトにないEmployee
クラスへのマッピングを作成するには、次の手順を実行します。
現行プロジェクトにEmployee
クラスを追加します。「プロジェクトの使用」を参照してください。
Employee
ディスクリプタへのリレーションシップ・マッピングを作成します。
Employee
ディスクリプタを非アクティブ化します。「アクティブおよび非アクティブ・ディスクリプタ」を参照してください。
プロジェクトのデプロイXMLを生成すると、Employee
クラスへのマッピングが組み込まれますが、Employee
クラスは含まれません。
バッチ読取りは、ほとんどのリレーショナル・マッピングで使用できます。この機能は、関連するオブジェクトが常にソース・オブジェクトとともに必要であることが知られている場合のみ、使用する必要があります。
表34-7は、どのリレーショナル・マッピングがこのオプションをサポートしているかを示します。
リレーションシップ・マッピングでバッチ読取りを使用するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「一般」タブをクリックします。「一般」タブが表示されます。
このマッピングでバッチ読取りを使用することを指定するには、「バッチ読取り」オプションを選択します。
例34-1 バッチを使用する問合せの最適化
次のコードの例では、問合せの最適化に対するバッチの使用を示しています。
// Queries on Employee are configured to always batch read Address
OneToManyMapping phoneNumbersMapping = new OneToManyMapping();
phoneNumbersMapping.setReferenceClass(" PhoneNumber.class")
phoneNumbersMapping.setAttributeName("phones");
phoneNumbersMapping.useBatchReading();
phoneNumbersMapping.privateOwnedRelationship();
問合せキー別の順序でコレクションを維持するようTopLinkを構成できます。
表34-8は、どのリレーショナル・マッピングがこのオプションをサポートしているかを示します。
マッピングの問合せキーの順序を指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「順序付け」タブをクリックします。「順序付け」タブが表示されます。
フィールド | 説明 |
---|---|
問合せキー | 順序付けする問合せキーを指定します。
「追加」をクリックして問合せキーを追加するか、「削除」をクリックして順序付け操作から問合せキーを削除します。 「上へ」または「下へ」をクリックして、選択された問合せキーのソート順序を変更します。 |
順序 | アルファベット順の「昇順」または「降順」のどちらで選択された問合せを順序付けするかを指定します。 |
外部キーは、別の表内の一意のキー(通常は主キー)を参照する1つ以上のデータベース列の組合せです。主キーと同様、外部キーは任意の数のフィールドで、これらすべてが1つの単位として扱われます。外部キーと参照先の親キーは、フィールドの数およびタイプが同じである必要があります。
oracle.toplink.mappings.ForeignReferenceMapping
の拡張であるマッピングでは、ターゲット・オブジェクトをインスタンス化できるように、外部キーを使用してデータベース内の情報を検索します。たとえば、すべてのEmployee
に属性address
があり、この属性にAddress
(独自のディスクリプタおよび表を所有)のインスタンスが含まれている場合、address
属性に対する1対1マッピングにより、特定のEmployee
のAddress
を見つけるための外部キー情報が指定されます。
TopLinkでは、外部キーはマッピングの2つのカテゴリ(外部キーおよびターゲット外部キー)に分類されます。
外部キーでは、キーはマッピング自体のディスクリプタに関連付けられた表にあります。たとえば、ADDRESS
へのEmployee
外部キーは、EMPLOYEE
表内にあります。
ターゲット外部キーでは、ターゲット・オブジェクトの表からマッピングのディスクリプタの表のキーへ逆方向に参照します。たとえば、ADDRESS
表は、EMPLOYEE
への外部キーを持ちます。
注意: マッピングを定義する前に、外部キーとターゲット外部キーの違いを完全に理解しておいてください。 |
表参照は、外部キー参照を含むデータベース表です。
表34-9は、どのリレーショナル・マッピングがこのオプションをサポートしているかを示します。
TopLink Workbenchを使用して、この表をデータベースからインポートするか、または作成することができます。データベースから表をインポートする場合(「データベースからの表のインポート」を参照)、TopLinkでは、既存のデータベース制約に対応する参照を作成します(ドライバでサポートされている場合)。また、データベースで同様の制約を作成しなくても、TopLinkで参照を定義することもできます。
マッピングの参照の表を指定するには、次の手順を実行します。
ナビゲータでマップされた属性を選択します。そのプロパティがエディタに表示されます。
「表参照」タブをクリックします。「参照」タブが表示されます。
次の情報を参照し、タブのフィールド参照を選択します。
フィールド | 説明 |
---|---|
表参照 | 既存の表を選択するか、または「新規」をクリックして新規の表参照を作成します。 |
「ソース・フィールド」および「ターゲット・フィールド」 | 「追加」をクリックして、新規の外部キー参照を作成します。
既存のキー・ペア参照を削除するには、「ソース・フィールド」と「ターゲット・フィールド」を選択して「削除」をクリックします。 |
ソース・フィールド | この外部キー参照のソース表からデータベース・フィールドを選択します。 |
ターゲット・フィールド | この外部キー参照のターゲット表からデータベース・フィールドを選択します。 |
ターゲット外部キー | 参照がターゲット・オブジェクトの表からマッピングのディスクリプタの表のキーへの逆方向かどうかを指定します。 |