Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/Development/Indigo/Multi-Tenancy"
(→Configuration) |
(→DDL generation) |
||
Line 60: | Line 60: | ||
=== DDL generation === | === DDL generation === | ||
− | DDL generation will need to support the generation of tenant id columns. | + | DDL generation will need to support the generation of tenant id columns. The DDL generation of fields is based off the descriptor's fields. During pre-initialization we therefore need to ensure that our tenant id fields are built and added to this list. This should be done after the descriptor table initialization (including inheritance hierarchies) has been preformed. |
+ | |||
+ | <code> | ||
+ | if (session.hasTenantId()) { | ||
+ | for (DatabaseTable table : getTables()) { | ||
+ | DatabaseField tenantIdField = session.getTenantIdField(); | ||
+ | tenantIdField.setTable(table); | ||
+ | getFields().add(buildField(tenantIdField)); | ||
+ | } | ||
+ | } | ||
+ | </code> |
Revision as of 10:31, 10 February 2011
Multi-Tenancy
The goal of this feature is to allow multiple tenants on the same database schema using a tenant id column.
Requirements
Configuration
The tenant id field and a tenant id value will be configured through EclipseLink properties within the persistence.xml file.
- eclipselink.multi-tenant.id
- eclipselink.multi-tenant.id-column
When a multi-tenant id is specified, the multi-tenant column will default to "TENANT_ID" if it is not specified by the user. That column is then expected to be available from the following tables of the schema:
- @Table
- @SecondaryTable
It is not expected for the following tables (which refers back to their related entity through a primary key association):
- @CollectionTable
- @JoinTable
NOTE: This assumes id generation is shared across persistence units. Otherwise, in a multi-tenant environment, the tenant id becomes part of the primary key and all tables must then have a tenant id (which becomes another join column on the relation tables)
When using DDL generation, the user need not worry about this. The DDL generation framework will be responsible for ensuring all necessary tables have a tenant id column.
Core
The tenant id and tenant id column will be applied in two places.
- We will leverage the current additional join expression from the DescriptorQueryManager to filter tenants. This is similar to the Additional Criteria feature.
- For inserts, we will append the tenant id column and value when building the row representation of an object. This is done in the following methods from ObjectBuilder (Note: similar thing is done for the the handling of the discriminiator column within an inheritance hierarchy)
- buildRow
- buildRowForShallowInsert
- buildRowForUpdate
- buildRowWithChangeSet
- buildTemplateInsertRow
Querying
The tenant id column and value will be supported through the following entity manager operations:
- persist
- find
- refresh
And the following queries:
- named queries
NOTE: EclipseLink will not modify, therefore, support multi-tenancy through named native queries. When using these types of queries within a multi-tenant environment, the user will need to be aware and handle any multi-tenancy issues themselves directly in their native query. To all intent and purpose, named native queries should be avoided in a multi-tenant environment.
DDL generation
DDL generation will need to support the generation of tenant id columns. The DDL generation of fields is based off the descriptor's fields. During pre-initialization we therefore need to ensure that our tenant id fields are built and added to this list. This should be done after the descriptor table initialization (including inheritance hierarchies) has been preformed.
if (session.hasTenantId()) {
for (DatabaseTable table : getTables()) { DatabaseField tenantIdField = session.getTenantIdField(); tenantIdField.setTable(table); getFields().add(buildField(tenantIdField)); }
}