[hibernate-dev] multi-tenancy in Hibernate and JPA 2.1
Steve Ebersole
steve at hibernate.org
Tue Apr 10 13:46:10 EDT 2012
On Wed 04 Apr 2012 04:26:30 PM CDT, Steve Ebersole wrote:
>> I am not sure how the PaaS multi-tenant config will look like exactly
>> but if we can
>> automatically prefix the 2LC regions without adding an explicit
>> mandatory property
>> that would be nice.
>
> Sure. The problem is that in the JPA-supported PaaS model, there is
> only really a need to know the tenant identifier when using
> SHARED_TABLE approach. There is a part of the proposal about making
> the tenant identifier available via ENC/JNDI. However, given that only
> the SHARED_TABLE approach (what we call DISCRIMINATED btw) in JPA
> needs access to it, I was not clear if that would be available to all
> approaches. But even there, I am not sure the ENC entry would be
> available when the EMF is getting built. This ties into THE critical
> difference between the multi-tenancy support I did already and what
> JPA is proposing: namely, Hibernate multi-tenancy supports a single
> SF/EMF instance serving multiple tenants, whereas the JPA model would
> constrain one EMF to serve a single tenant.
>
> So short answer.. I don't know either. But if it the tenant identifier
> is know when building EMF/SF, then yes, the plan was to use region
> prefixes.
Just clarified that:
a) the tenant identifier would be made available regardless of the
multi-tenancy approach,
b) the tenant identifier would be made available when the EMF/SF is
starting up; not via JNDI though, the container is expected to pass it
along to the JPA provider via createEMF call.
So it looks like there will in fact be an explicit config setting for
this. Additionally, we are probably going to need another new setting
to indicate whether to enable single-EMF-serves-one-tenant versus
single-EMF-serves-multiple-tenants support (good name suggestions for
this?).
Also, it looks like JPA will not standardize an annotation for naming
the tenant identifier column in mappings for the SHARED_TABLE
(DISCRIMINATED) approach. So we need to decide if we are going to
supply our own annotation or fall in line with the JPA assumption that
the column would just be named the same for all shared tables.
Still one more consideration is whether (and if so, how) we want to
allow for mixed multi-tenant and non-multi-tenant data. Imagine a
trivial example of a COUNTRY code-set table, where all tenants are
sharing that data. This is really just a concern with SHARED_TABLE
multi-tenancy, although even in the other 2 approaches it would be nice
to know that as we could limit second-level caching footprint for that
shared data. Basically I see opt-in and opt-out as the 2 options here.
Personally I prefer that if multi-tenancy is enabled that we assume
all data is multi-tenant and any shared data would need to be opted-out.
I can see 2 opting-mechanisms:
a) mapping data (annotation)
b) config property (hibernate.multi_tenancy.shared_entities
Any other suggestions/thoughts?
--
steve at hibernate.org
http://hibernate.org
More information about the hibernate-dev
mailing list