ヘッダーをスキップ
Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス
12c (12.1.2)
E48005-01
  目次へ移動
目次

前
 
次
 

@Multitenant

@Multitenant注釈は、指定のエンティティがアプリケーションの複数のテナント間で共有されることを指定します。マルチテナント・タイプは、これらのエンティティのデータを各テナントのデータベースに格納する方法を指定します。エンティティ・レベルまたはマップされたスーパークラス・レベルでマルチテナンシを指定できます。

注釈要素

表2-32は、この注釈の要素を示しています。

表2-32 @Multitenantの注釈要素

注釈要素 説明 デフォルト

boolean includeCriteria

SELECTUPDATEおよびDELETE問合せにテナント基準を追加することが、データベースによって要求されるかどうかを示します。

true

MultitenantType value

使用するマルチテナント方針(SINGLE_TABLETABLE_PER_TENANTまたはVPD)を指定します。

SINGLE_TABLE


使用方法

@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つの表を共有できること、および各テナントのデータが識別子列によって他のテナントのデータと区別されることを意味します。単一表マルチテナンシとともに複数の表を使用できますが、その場合、エンティティの永続データは複数の表(TableおよびSecondaryTable)に格納され、複数のテナントがすべての表を共有できます。


テナント識別子列を使用して単一表マルチテナンシを構成する方法の詳細は、「@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生成は、テナントごとの表の方針に該当する、すべてのテナントで一意であると想定されます。

テナントごとの表マルチテナンシを構成する場合は、次を指定する必要があります。

次の例では、エンティティでテナントごとの表マルチテナンシを定義するために使用される@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マルチテナンシ

VPD (仮想プライベート・データベース)マルチテナンシ・タイプは、データベースがすべてのSELECT、UPDATEおよびDELETE問合せでテナントのフィルタリングを処理することを指定します。このタイプを使用する場合、永続性ユニットとともに使用されるプラットフォームでVPDがサポートされている必要があります。

TopLink VPDマルチテナンシを使用する場合、@Multitenantおよび@TenantDiscriminatorColumnを使用して、最初にデータベースでVPDを構成してから、エンティティまたはマップされたスーパークラスでマルチテナンシを指定する必要があります。

例2-63に、エンティティに定義されたVPDマルチテナンシを示します。前述のとおり、データベースのVPDもVPDマルチテナンシを有効にするように構成する必要があります。この場合、VPDデータベースは、USER_ID列を使用して指定クライアントによる指定行へのアクセスを制限するように構成されています。そのため、USER_IDは、TopLinkマルチテナント操作のテナント識別子列としても指定されます。

例2-63 @Multitenant(VPD)の使用例

例は次のとおりです。

@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>

関連項目