2

I have a multi-tenant application (which works)

There multiple Persistence Unit for each tenant

<persistence-unit name="hbase_pu_new">
        <provider>com.impetus.kundera.KunderaPersistence</provider>
        <class>classnames</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
    </persistence-unit>

<persistence-unit name="mysqlPU" transaction-type="RESOURCE_LOCAL">
        <provider>
            org.hibernate.jpa.HibernatePersistenceProvider-->
      </provider>
            <class>classnames</class>
            <exclude-unlisted-classes>true</exclude-unlisted-classes>
        </persistence-unit>

& Tenant Wise application Context looks as below

<context:component-scan base-package="com.example" />

<!--    <mvc:annotation-driven /> -->

    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="hbase_pu_new" />
        <!--<property name="persistenceUnitName" value="hbase_pu_new" />-->
        <property name="jpaProperties">

            <props>
                <prop key="kundera.nodes">zookeeperIP</prop>
                <prop key="kundera.port">2181</prop>
                <prop key="kundera.keyspace">lidsys42_dev_2</prop>
                <prop key="kundera.dialect">hbase</prop>
                <prop key="kundera.ddl.auto.prepare">update</prop>
                <prop key="kundera.client.lookup.class">com.impetus.client.hbase.HBaseClientFactory</prop>
            </props>

        </property>
        <property name="packagesToScan" value="com.example.data"/>
        <!--<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />-->
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
    </bean>
    <bean id="entityManagerFactory_Mysql"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="mysqlPU" />

        <property name="jpaProperties">

        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.url">jdbc:mysql://<IP>:3306/databasename</prop>
            <prop key="hibernate.connection.username">root</prop>
            <prop key="hibernate.connection.password">mynewpassword</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.jdbc.batch_size">100</prop>
        </props>
        </property>
        <property name="packagesToScan" value="com.example.mysqldata"/>

        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>

        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <bean id="transactionManager_Mysql" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory_Mysql" />
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />
    <tx:annotation-driven transaction-manager="transactionManager_Mysql" />

I load all applicationContext into Static ConcurrentHashMap with tenantName & its BeanFactory

This works with me as Spring restController has tenantID as parameter & I get its associated BeanFactory From map. [Also this gives complete container isolation & transaction support]

Since I am using different datasources for different tenant I ended up refactoring it as per

http://fizzylogic.nl/2016/01/24/Make-your-Spring-boot-application-multi-tenant-aware-in-2-steps/

http://jannatconsulting.com/blog/?p=41

https://github.com/vtajzich/spring-hibernate4-multitenant

Spring Boot + Spring Data with multi tenancy

Above doesn't give transaction support.

Is there anyway where I can load only tenant specific entity manager & programatically handle it in associated repositories

EDIT: Hibernate, Spring versions are latest

alexbt
  • 16,415
  • 6
  • 78
  • 87
Ashish
  • 1,856
  • 18
  • 30

0 Answers0