Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス 12c (12.1.2) E48005-01 |
|
前 |
次 |
@Multitenant
注釈は、指定のエンティティがアプリケーションの複数のテナント間で共有されることを指定します。マルチテナント・タイプは、これらのエンティティのデータを各テナントのデータベースに格納する方法を指定します。エンティティ・レベルまたはマップされたスーパークラス・レベルでマルチテナンシを指定できます。
注釈要素
表2-32は、この注釈の要素を示しています。
表2-32 @Multitenantの注釈要素
注釈要素 | 説明 | デフォルト |
---|---|---|
|
|
|
|
使用するマルチテナント方針( |
|
使用方法
@Multitenant
注釈を使用する場合は、@Entity
または@MappedSuperclass
注釈とともにこの注釈を指定します。次に例を示します。
@Entity @Multitenant ... public class Employee() { ... }
次の3種類のマルチテナンシを使用できます。
例
例2-58に、@Multitenant
注釈の簡単な例を示します。この例では、PlayerエンティティにはデフォルトのPLAYER
表に格納された複数のテナントの行があり、デフォルトのTENANT_ID
列はデフォルトのコンテキスト・プロパティeclipselink.tenant-id
とともに識別子として使用されます。
例2-58 最小の@Multitenant注釈
@Entity @Multitenant public class Player { }
アプリケーションで共有のEntityManagerFactory
を使用し、EntityManager
をテナント固有にする場合、ランタイム・コードは次のようになります。
Map<String, Object> emProperties = new HashMap<String, Object>(); emProperties.set("eclipselink.tenant-id", "HTHL"); EntityManager em = emf.createEntityManager(emProperties);
詳細な例は、「単一表マルチテナンシ」、「テナントごとの表マルチテナンシ」および「VPDマルチテナンシ」を参照してください。
SINGLE_TABLE
マルチテナント・タイプは、エンティティまたはマップされたスーパークラスがマップする表に複数のテナントの行を含めることができることを指定します。テナント固有の行へのアクセスは、テナントに限定されます。
テナント固有の行は、テナント識別子列を使用することによってテナントに関連付けられます。識別子列は、アプリケーション・コンテキスト値とともに使用され、永続性コンテキストがアクセスできる対象を制限します。
マップされた表での問合せの結果は、プロパティ値として提供されるテナント識別子値に制限されます。これは、表のすべての挿入、更新および削除操作に適用されます。マルチテナント・メタデータがマップされたスーパークラス・レベルで適用される場合、サブエンティティによって独自のマルチテナント・メタデータが指定されていないかぎり、すべてのサブエンティティに適用されます。
注意: 単一表マルチテナンシのコンテキストでは、「単一表」は、複数のテナントが1つの表を共有できること、および各テナントのデータが識別子列によって他のテナントのデータと区別されることを意味します。単一表マルチテナンシとともに複数の表を使用できますが、その場合、エンティティの永続データは複数の表( |
テナント識別子列を使用して単一表マルチテナンシを構成する方法の詳細は、「@TenantDiscriminatorColumn」を参照してください。
次の例では、@Multitenant
、@TenantDiscriminatorColumn
およびコンテキスト・プロパティを使用して、エンティティに単一表マルチテナンシを定義します。
例2-59 @Multitenantの使用例
@Entity @Table(name=“EMP”) @Multitenant(SINGLE_TABLE) @TenantDiscriminatorColumn(name = “TENANT_ID”, contextProperty = "employee-tenant.id")
次の例では、<multitenant>
要素を使用して、最小の単一表マルチテナンシを指定します。SINGLE_TABLE
はデフォルト値のため、指定する必要はありません。
例2-60 <multitenant>の使用例
<entity class="model.Employee"> <multitenant/> <table name="EMP"/> ... </entity>
TABLE_PER_TENANT
マルチテナント・タイプは、エンティティの表(Table
およびSecondaryTable
)がテナント・コンテキストに基づいたテナント固有の表であることを指定します。これらの表へのアクセスは、指定のテナントに限定されます。結合表またはコレクション表を使用するエンティティ内のリレーションシップも、そのコンテキスト内に存在すると想定されます。
他のマルチテナント・タイプと同様に、エンティティ・レベルまたはマップされたスーパークラス・レベルで、テナントごとの表マルチテナンシを指定できます。エンティティ・レベルでは、トランザクションが開始した後、各エンティティ・マネージャでテナント・コンテキスト・プロパティを提供する必要があります。
テナントごとの表エンティティは、同じ永続性ユニット内の他のマルチテナント・タイプのエンティティと混在できます。
テナントのすべての読取り、挿入、更新および削除操作は、テナントの表にのみ適用されます。
テナントは、デフォルトで同じサーバー・セッションを共有します。各エンティティ・マネージャに対して、テナントごとの表の識別子を設定または更新する必要があります。ID生成は、テナントごとの表の方針に該当する、すべてのテナントで一意であると想定されます。
テナントごとの表マルチテナンシを構成する場合は、次を指定する必要があります。
ユーザーを特定するテナントごとの表のプロパティ。エンティティ・マネージャごとに設定するか、永続性ユニット当たりのテナントごとの表を分離するために、エンティティ・マネージャ・ファクトリで設定できます。
他のテナントの表からテナントの表を特定および分離するためのテナント表識別子。識別子タイプは、SCHEMA
、SUFFIX
およびPREFIX
です。テナント識別子タイプの詳細は、「@TenantTableDiscriminator」を参照してください。
次の例では、エンティティでテナントごとの表マルチテナンシを定義するために使用される@Multitenant
注釈を示します。@TenantTableDiscriminator(SCHEMA)
は、識別子表がスキーマによって特定されることを指定します。
例2-61 @Multitenantと@TenantTableDiscriminatorの使用例
@Entity @Table(name=“EMP”) @Multitenant(TABLE_PER_TENANT) @TenantTableDiscriminator(SCHEMA) public class Employee { ... }
次の例では、最小のテナントごとの表マルチテナンシを定義するために使用される<multitenant>
要素および<tenant-table-discriminator>
要素を示します。
例2-62 <multitenant>と<tenant-table-discriminator>の使用例
<entity class="Employee"> <multitenant type="TABLE_PER_TENANT"> <tenant-table-discriminator type="SCHEMA"/> </multitenant> <table name="EMP"> ... </entity>
VPD
(仮想プライベート・データベース)マルチテナンシ・タイプは、データベースがすべてのSELECT、UPDATEおよびDELETE問合せでテナントのフィルタリングを処理することを指定します。このタイプを使用する場合、永続性ユニットとともに使用されるプラットフォームでVPDがサポートされている必要があります。
TopLink VPDマルチテナンシを使用する場合、@Multitenant
および@TenantDiscriminatorColumn
を使用して、最初にデータベースでVPDを構成してから、エンティティまたはマップされたスーパークラスでマルチテナンシを指定する必要があります。
例2-63に、エンティティに定義されたVPDマルチテナンシを示します。前述のとおり、データベースのVPDもVPDマルチテナンシを有効にするように構成する必要があります。この場合、VPDデータベースは、USER_ID列を使用して指定クライアントによる指定行へのアクセスを制限するように構成されています。そのため、USER_ID
は、TopLinkマルチテナント操作のテナント識別子列としても指定されます。
@Entity @Multitenant(VPD) @TenantDiscriminatorColumn(name = "USER_ID", contextProperty = "tenant.id") @Cacheable(false) public class Task implements Serializable { ... ...
例は次のとおりです。
例2-64 <multitenant>の使用例
<entity class="model.Employee"> <multitenant type="VPD"> <tenant-discriminator-column name="USER_ID" context-property="tenant.id"/> </multitenant> <table name="EMPLOYEE"/> ... </entity>
関連項目
『Oracle TopLinkソリューション・ガイド』のマルチテナンシの使用に関する項
マルチテナントの例: http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant