EclipseLink
EclipseLink支持多种多租户(multi-tenancy)实现。 主要通过@Multitenant等相关的annotation来提供对multi-tenancy的支持。
public @interface Multitenant {
MultitenantType value() default MultitenantType.SINGLE_TABLE;
boolean includeCriteria() default true;
}
@Multitenant
支持SINGLE_TABLE
和TABLE_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方式的多租户实现。