Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multi-tenant webapp using Spring MVC and Hibernate 4.2.0.Final

I have developed a small webapp using and SpringMVC(3.1.3.RELEASE) and Hibernate 4.2.0.Final.

I'm trying to convert it to be a multi-tenant application.

Similar topics have been covered in other threads, but I couldn't find a definitive solution to my problem.

What I am trying to achieve is to design a web app which is able to:

  1. Read a datasource configuration at startup (an XML file containing multiple datasource definitions, which is placed outside the WAR file and it's not the application-context or hibernate configuration file)

  2. Create a session factory for each one of them (considering that each datasource is a database with a different schema).

  3. How can i set my session factory scope as session? ( OR Can i reuse the same session factory ?) .

Example:

 Url for client a - URL: http://project.com/a/login.html
 Url for client b - URL: http://project.com/b/login.html

If client "a" make request,read the datasource configuration file and Create a session factory using that XML file for the client "a".

This same process will be repeating if the client "b" will send a request.

What I am looking, how to implement datasource creation upon customer subscription without editing the Spring configuration file. It needs to be automated.

Here is my code ,that i have done so far.

Please anyone tell me,What modifications i need to be made?

Please give an answer with some example code..I am quite new in spring and hibernate world.

Spring.xml

  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" p:driverClassName="${jdbc.driverClassName}"

        p:url="${jdbc.databaseurl}" 
p:username="${jdbc.username}" p:password="${jdbc.password}" />

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

<bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />

JDBC.properties File

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.databaseurl=jdbc:mysql://localhost:3306/Logistics
jdbc.username=root
jdbc.password=rot@pspl#12

hibernate.cfg.xml File

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
    <mapping class="pepper.logis.organizations.model.Organizaions" />
    <mapping class="pepper.logis.assets.model.Assets" />

</session-factory>
</hibernate-configuration>

Thanks,

like image 394
edaklij Avatar asked Nov 10 '22 16:11

edaklij


1 Answers

First create a table for Tenant with tenant_id and associate it with all users.Now, you can fetch this details while the user logs in and set it in session.

like image 81
Rathi Avatar answered Nov 15 '22 12:11

Rathi