Interface IncludeViaAndDomainKey


public interface IncludeViaAndDomainKey

Using includeVia with Composite Keys and domainKey

In some legacy systems, composite primary keys are used to simulate multi-tenancy, often by including a domainKey or a similar field in the key. Smart GWT supports this pattern by allowing includeVia to work with composite keys.

This usage is generally discouraged in modern development. We strongly recommend using Smart GWT?s transparent multi-tenancy approach instead, which provides true multi-tenant separation with less complexity and better long-term maintainability.

However, if you're working with an existing legacy system that uses this pattern, includeVia can be used to precisely define foreign key paths involving composite keys and indirect relation chains.

The examples below are based on the DataSources shown at the end of this section and are using the same data structure as in the includeVia syntax and behavior, but with an additional domainKey primary key field added to all DataSources to separate data into logical domains such as "live" and "test". Similarly all examples below also resolve the same relation chain:

  Order > Customer (via accountMgrEmployeeNumber) > Employee > Office
  

Example 1: Full path specified

Explicit composite keys at every step.
  includeFrom="Customer.Employee.Office.city"
  includeVia="Order.customerNumber-domainKey:Customer.accountMgrEmployeeNumber-domainKey:Employee.officeCode-domainKey"
  

Example 2: Partial includeVia with omitted datasource names

Unambiguous field names allow datasource names to be omitted.
  includeFrom="Customer.Employee.Office.city"
  includeVia="customerNumber-domainKey:accountMgrEmployeeNumber-domainKey"
  

Example 3: Minimal includeVia

Only the override for the non-default FK path is needed; the rest is resolved automatically.
  includeFrom="Customer.Employee.Office.city"
  includeVia="accountMgrEmployeeNumber-domainKey"
  

Example 4: Shorter includeFrom with full includeVia

The includeFrom starts mid-chain, but includeVia ensures correct relation chain from the base DataSource.
  includeFrom="Employee.Office.city"
  includeVia="Order.customerNumber-domainKey:Customer.accountMgrEmployeeNumber-domainKey:Employee.officeCode-domainKey"
  

Example 5: Minimal includeFrom and includeVia

System finds shortest valid path from base to target using the provided override.
  includeFrom="Office.city"
  includeVia="accountMgrEmployeeNumber-domainKey"
  

Datasources used in samples:

  <DataSource ID="Order" serverType="sql">
      <fields>
          <field name="orderNumber" type="integer" primaryKey="true" />
          <field name="domainKey" type="text" primaryKey="true" foreignKey="Customer.domainKey"/>
          <field name="orderDate" type="date" required="true"/>
          <field name="customerNumber" type="integer" foreignKey="Customer.customerNumber" />
      </fields>
  </DataSource>
  
  <DataSource ID="Customer" serverType="sql">
      <fields>
          <field name="customerNumber" type="integer" primaryKey="true" />
          <field name="domainKey" type="text" primaryKey="true" foreignKey="Employee.domainKey" />
          <field name="customerName" type="text" required="true"/>
          <field name="salesRepEmployeeNumber" type="integer" foreignKey="Employee.employeeNumber" />
          <field name="accountMgrEmployeeNumber" type="integer" foreignKey="Employee.employeeNumber" />
      </fields>
  </DataSource>
  
  <DataSource ID="Employee" serverType="sql">
      <fields>
          <field name="employeeNumber" type="integer" primaryKey="true" />
          <field name="domainKey" type="text" primaryKey="true" foreignKey="Office.domainKey"/>
          <field name="lastName" type="text" required="true"/>
          <field name="firstName" type="text" required="true"/>
          <field name="officeCode" type="text" foreignKey="Office.officeCode" />
      </fields>
  </DataSource>
  
  <DataSource ID="Office" serverType="sql">
      <fields>
          <field name="officeCode" type="text" primaryKey="true" />
          <field name="domainKey" type="text" primaryKey="true" />
          <field name="city" type="text" />
      </fields>
  </DataSource>