Oracle® Fusion Middleware Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス 12c (12.1.2) E48005-01 |
|
![]() 前 |
![]() 次 |
@TenantDiscriminator
注釈は、@Multitenant
注釈およびSINGLE-TABLE
マルチテナント・タイプとともに使用され、永続性コンテキストが単一表マルチテナンシでアクセスできる対象を制限します。
注釈要素
表2-67は、この注釈の要素を示しています。
表2-67 @TenantDiscriminatorColumnプロパティ
注釈要素 | 説明 | デフォルト |
---|---|---|
|
(オプション)識別子列のDDLを生成する際に使用されるSQLフラグメント。 |
指定の識別子タイプの列を作成するプロバイダ生成SQL。 |
|
(オプション)テナント識別子列に適用されるコンテキスト・プロパティの名前。 |
|
|
(オプション)クラス識別子として使用するオブジェクト/列のタイプ。 |
|
|
(オプション)文字列ベースの識別子タイプの列長。 |
文字列ベースの識別子タイプの列長。その他の識別子タイプでは無視されます。 |
|
(オプション)テナント識別子に使用される列の名前。 |
|
|
テナント識別子列が表の主キーの一部であることを指定します。 |
|
|
(オプション)列を含む表の名前。 |
列を含む表の名前。存在しない場合、列はプライマリ表にあると想定されます。列がセカンダリ表にある場合は、この属性を指定する必要があります。 |
使用方法
単一表マルチテナンシを構成する場合は、次の両方を指定する必要があります。
次のとおり、@Multitenant
注釈を使用して、単一表マルチテナンシを使用するためにエンティティまたはマップされたスーパークラスに注釈を付与します。
@Entity @Table(name=“EMP”) @Multitenant(SINGLE_TABLE)
SINGLE_TABLE
は、指定されたエンティティに関連付けられている表(Table
およびSecondaryTable
)をテナント間で共有できることを示します。
注意: 識別子列はプライマリ表にあると想定されるため、 |
次のとおり、@TenantDiscriminatorColumn
注釈を使用して、識別子列として使用される列を指定します。
@Entity @Table(name=“EMP”) @Multitenant(SINGLE_TABLE) @TenantDiscriminatorColumn(name = “TENANT_ID”)
次のとおり、@TenantDiscriminatorColumns
注釈を使用することにより、複数の識別子列を指定できます。
@Entity @Table(name = "EMPLOYEE") @Multitenant(SINGLE_TABLE) @TenantDiscriminatorColumns({ @TenantDiscriminatorColumn(name = "TENANT_ID") @TenantDiscriminatorColumn(name = "TENANT_CODE" contextProperty="eclipselink.tenant-code")})
識別子列の使用
次の特性が、識別子列に適用されます。
永続化する場合、テナント識別子列の値は、関連付けられたコンテキスト・プロパティから移入されます。
テナント識別子列は、アプリケーションで定義できます。つまり、識別子列は、各共有エンティティ表の固有の列に関連付けられません。TENANT_ID
、T_ID
などを使用できます。
アプリケーションが定義できるテナント識別子列の数に制限はありません。
識別子列には任意の名前を使用できます。
テナント識別子列は、常に@Multitenant(SINGLE_TABLE
)とともに使用される必要があります。テナント識別子列のみを指定することはできません。
生成されたスキーマに指定のテナント識別子列を含めることができます。
テナント識別子列をマップまたはマップ解除できます。
テナント識別子列がマップされる場合、関連付けられたマッピング属性は読取り専用としてマークする必要があります。この制限により、テナント識別子列をエンティティIDの一部にすることはできず、データベースの主キー仕様の一部にすることだけが可能になります。
SELECT
問合せを発行する場合、マップされたプロパティとマップ解除されたプロパティの両方を使用して追加基準を作成します。
継承階層での単一表マルチテナンシの使用
継承方針は、継承タイプを指定することによって構成されます(@javax.persistence.Inheritanceを参照してください)。単一表マルチテナンシは、次のとおり、継承階層で使用できます。
SINGLE_TABLE
またはJOINED
継承方針を使用する場合、マルチテナント・メタデータは継承階層のルート・レベルでのみ適用できます。
TABLE_PER_CLASS
継承階層内でもマルチテナント・メタデータを指定できます。この場合、すべてのエンティティに、すべてのマッピングデータが含まれた独自の表があります(SINGLE_TABLE
またはJOINED
方針の場合はありません)。その結果、TABLE_PER_CLASS
方針では、階層の一部のエンティティがマルチテナントになり、その他はマルチテナントにならない場合があります。エンティティを単一表に分離してタイプのみを構築することはできないため、その他の継承方針ではルート・レベルでマルチテナンシのみを指定できます。
例
表2-67に、テナント識別子列の多くの使用例を示します。
例2-110 @TenantDiscriminatorColumn注釈の使用
/** Single tenant discriminator column **/ @Entity @Table(name = "CUSTOMER") @Multitenant @TenantDiscriminatorColumn(name = "TENANT", contextProperty = "multi-tenant.id") public Customer() { ... } /** Multiple tenant discriminator columns using multiple tables **/ @Entity @Table(name = "EMPLOYEE") @SecondaryTable(name = "RESPONSIBILITIES") @Multitenant(SINGLE_TABLE) @TenantDiscriminatorColumns({ @TenantDiscriminatorColumn(name = "TENANT_ID", contextProperty = "employee-tenant.id", length = 20) @TenantDiscriminatorColumn(name = "TENANT_CODE", contextProperty = "employee-tenant.code", discriminatorType = STRING, table = "RESPONSIBILITIES") } ) public Employee() { ... } /** Tenant discriminator column mapped as part of the primary key on the database **/ @Entity @Table(name = "ADDRESS") @Multitenant @TenantDiscriminatorColumn(name = "TENANT", contextProperty = "tenant.id", primaryKey = true) public Address() { ... } /** Mapped tenant discriminator column **/ @Entity @Table(name = "Player") @Multitenant @TenantDiscriminatorColumn(name = "AGE", contextProperty = "tenant.age") public Player() { ... @Basic @Column(name="AGE", insertable="false", updatable="false") public int age; }
例2-111に、eclipselink-orm.xml
ファイルの<tenant-disciminator-column>
XML要素を使用する同一マッピングを示します。
例2-111 <tenant-discriminator-column> XML注釈の使用
<!-- Single tenant discriminator column --> <entity class="model.Customer"> <multitenant> <tenant-discriminator-column name="TENANT context-property="multi-tenant.id""/> </multitenant> <table name="CUSTOMER"/> ... </entity>
<!-- Multiple tenant discriminator columns using multiple tables --> <entity class="model.Employee"> <multitenant type="SINGLE_TABLE"> <tenant-discriminator-column name="TENANT_ID" context-property="employee-tenant.id" length="20"/> <tenant-discriminator-column name="TENANT_CODE" context-property="employee-tenant.id" discriminator-type="STRING" table="RESPONSIBILITIES"/> </multitenant> <table name="EMPLOYEE"/> <secondary-table name="RESPONSIBILITIES"/> ... </entity>
<!-- Tenant discriminator column mapped as part of the primary key on the database --> <entity class="model.Address"> <multitenant> <tenant-discriminator-column name="TENANT" context-property="multi-tenant.id" primary-key="true"/> </multitenant> <table name="ADDRESS"/> ... </entity>
<!-- Mapped tenant discriminator column --> <entity class="model.Player"> <multi-tenant> <tenant-discriminator-column name="AGE" context-property="tenant.age"/> </multi-tenant> <table name="PLAYER"/> ... <attributes> <basic name="age" insertable="false" updatable="false"> <column name="AGE"/> </basic> ... </attributes> ... </entity>
関連項目
『Oracle TopLinkソリューション・ガイド』のマルチテナンシの使用に関する項