[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-7312) Allow usage of multi-tenancy from HEM

Steve Ebersole (JIRA) noreply at atlassian.com
Tue May 15 12:37:11 EDT 2012


    [ https://hibernate.onjira.com/browse/HHH-7312?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=46672#comment-46672 ] 

Steve Ebersole commented on HHH-7312:
-------------------------------------

To me, "re-purposing" of {{CurrentTenantIdentifierResolver}} comes under HHH-7306.  Then HEM support for core multi-tenancy simply picks up on top of that

However, there are still things to think through like how to bridge passed in datasource info ({{PersistenceUnitInfo}}) with multi-tenancy support.  Most likely all we can really do is validation.  If a datasource is given, we really need to expect {{org.hibernate.MultiTenancyStrategy#SCHEMA}} (provided a {{MultiTenantConnectionProvider}} is also specified) or {{org.hibernate.MultiTenancyStrategy#DISCRIMINATOR}} (currently not implemented).  {{org.hibernate.MultiTenancyStrategy#NONE}} is obviously OK as well.  But {{org.hibernate.MultiTenancyStrategy#DATABASE}} is simply not going to be workable.

And just in general, support for multi-tenancy from HEM is completely not scoped out.  So we need to think through all the little details.

> Allow usage of multi-tenancy from HEM
> -------------------------------------
>
>                 Key: HHH-7312
>                 URL: https://hibernate.onjira.com/browse/HHH-7312
>             Project: Hibernate ORM
>          Issue Type: New Feature
>          Components: entity-manager
>    Affects Versions: 4.1.2
>         Environment: Hibernate 4.1.2, using JPA
>            Reporter: Oriel Maute
>            Priority: Minor
>              Labels: jpa2, multi-tenancy
>         Attachments: persistence.xml, SchemaBasedMultiTenancyTest.java, SchemaBasedMultiTenantConnectionProvider.java, SchemaBasedTenantResolver.java
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> I tried to use db schema based multi tenancy with hibernate jpa / entitymanager. I use the following properties in persistence.xml:
> <property name="hibernate.multiTenancy" value="SCHEMA"/>
> <property name="hibernate.tenant_identifier_resolver" value="com.xoricon.persistence.bo.multitenancy.test.SchemaBasedTenantResolver"/>
> <property name="hibernate.multi_tenant_connection_provider" value="com.xoricon.persistence.bo.multitenancy.test.SchemaBasedMultiTenantConnectionProvider"/> 
> Both instances (SchemaBasedTenantResolver / SchemaBasedMultiTenantConnectionProvider) will be instantiated by hibernate. 
> When i call:
>   EntityManagerFactory lEntityManagerFactory= Persistence.createEntityManagerFactory("orm1");
>   EntityManager lManager = lEntityManagerFactory.createEntityManager();
> I get:
> System.out: SchemaBasedMultiTenantConnectionProvider.getAnyConnection()
> System.out: SchemaBasedTenantResolver.<init>()
> E
> Time: 1,53
> There was 1 error:
> 1) test1(com.xoricon.persistence.bo.multitenancy.test.SchemaBasedMultiTenancyTest)org.hibernate.HibernateException: SessionFactory configured for multi-tenancy, but no tenant identifier specified
> 	at org.hibernate.internal.AbstractSessionImpl.<init>(AbstractSessionImpl.java:82)
> 	at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:231)
> 	at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1831)
> 	at org.hibernate.ejb.EntityManagerImpl.getRawSession(EntityManagerImpl.java:121)
> 	at org.hibernate.ejb.EntityManagerImpl.getSession(EntityManagerImpl.java:98)
> 	at org.hibernate.ejb.AbstractEntityManagerImpl.setDefaultProperties(AbstractEntityManagerImpl.java:268)
> 	at org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:180)
> 	at org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:90)
> 	at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:178)
> 	at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:173)
> 	at com.xoricon.persistence.bo.multitenancy.test.SchemaBasedMultiTenancyTest.test1(SchemaBasedMultiTenancyTest.java:40)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> 	at com.xoricon.persistence.bo.multitenancy.test.SchemaBasedMultiTenancyTest.main(SchemaBasedMultiTenancyTest.java:51)
> FAILURES!!!
> Tests run: 1,  Failures: 0,  Errors: 1
> In System.out "SchemaBasedTenantResolver.<init>()" shows, that my CurrentTenantIdentifierResolver has been instantiated. But Hiberante did not call method "public String resolveCurrentTenantIdentifier()". 
> I expect, that Hibernate uses the CurrentTenantIdentifierResolver to get the current tenant id. 
> In JPA i cannot set the tenant on the Session, because the exception above occures before Session has been created. I can access the Session only by EntityManager.getDelegate(). But as shown above, i cannot create an EntityManager instance.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list