EclipseLink支持多种多租户(multi-tenancy)实现。 主要通过@Multitenant等相关的annotation来提供对multi-tenancy的支持。

public @interface Multitenant {
    MultitenantType value() default MultitenantType.SINGLE_TABLE;
    boolean includeCriteria() default true;
}

@Multitenant支持SINGLE_TABLETABLE_PER_TENANT等方式(还有VPD)。 SINGLE_TABLE表示多个租户共用一张表;一般这种方式单租户的成本比较低。 TABLE_PER_TENANT表示不同租户的表是隔离的。隔离的方式有不同的租户的表有不同的前缀/后缀或者放在不同的schema里。

配置好相关的annotation后,查询、更新或者删除时EclipseLink会自动帮你在query里拼接上tenant信息。 在某些情况下,自动拼出来的query也会有问题。比如EclipseLink 2.6.2在multi-tenancy下的left join就有问题。 EclipseLink会在left join的where子句里拼接上tenant相关的条件,

SELECT t0.ID, t1.ID FROM CURRENCY t0 LEFT OUTER JOIN EXCHANGERATE t1 
  ON (((t1.currencyId = t0.ID) AND (t1.RATEDATE >= ?)) AND (t1.RATEDATE <= ?)) 
  WHERE (((t0.STATUS = ?) AND (t0.TENANT_ID = ?)) AND (t1.TENANT_ID = ?))

(t1.TENANT_ID = ?)会使得left join“退化”成inner join。

对于这种问题可以用native query来避免EclipseLink对query的修改; 或者,把includeCriteria设为false,用@AdditionalCriteria来自己实现multi-tenancy。

@Multitenant@AdditionalCriteria都可以加到@MappedSuperclass上,这样就省去了每个entity都加一遍的麻烦。

Hibernate

Hibernate也支持multi-tenancy。 不过直到Hibernate 5.2还不支持shared table方式的多租户实现。