Uploaded image for project: 'Hibernate ORM'
  1. HHH-7312

Validate multi-tenancy configuration (if configured) during JPA bootstrap

    Details

    • Type: New Feature
    • Status: Open
    • Priority: Minor
    • Resolution: Unresolved
    • Affects versions: 4.1.2
    • Fix versions: None
    • Environment:
      Hibernate 4.1.2, using JPA
    • Last commented by a user?:
      true
    • Sprint:

      Description

      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.

        Attachments

          Issue links

            Activity

              People

              • Votes:
                7 Vote for this issue
                Watchers:
                12 Start watching this issue

                Dates

                • Created:
                  Updated:

                  Time Tracking

                  Estimated:
                  Original Estimate - 1h
                  1h
                  Remaining:
                  Remaining Estimate - 1h
                  1h
                  Logged:
                  Time Spent - Not Specified
                  Not Specified