Skip to content

Demonstrates the discriminator field (shared schema) based multi-tenant application using Spring Boot & Hibernate 5.

Notifications You must be signed in to change notification settings

wangsoft/multi-tenant-app-demo

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

README

Sample Application to demonstrate Multi-tenancy based on discriminator field using Spring Boot & Hibernate.

Since hibernate (5.x) has some issues (refer the link below) in supporting the 'Discriminator' based multi-tenancy strategy. This following workaround will help to achieve the same.

Approach:

  • Uses hibernate filter to limit the query results based on tenant.
  • Uses hibernate interceptors to enforce tenant details during creating/updating entities.
  • Uses Spring AOP (AspectJ) to set the filter parameters.

Explanation:

  • Each request goes thru a custom servlet filter which checks for X-TenantID http header and set's it in the ThreadLocal variable using TenantContext class. If http header is not present in request, it'll be rejected.
  • Controller routes the request to Service class and the Spring AOP (UserServiceAspect class) intercepts the service call and set's the hibernate tenant filter.
  • All the service method has to be annotated with @Transactional for UserServiceAspect to work.
  • Above method works only for read queries, for write queries, we have to use hibernate interceptors.
  • Custom Entity interceptor (using EmptyInterceptor) class which sets the tenantId value during the save/delete/flush-dirty entity events.
  • Entity class should implement TenantSupport interface for the Entity interceptor to work.

Usage:

  • curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -H 'X-TenantID: test2' -d '{"firstName":"king","username":"wangsoft","lastName":"soft"}'
  • curl -X GET http://localhost:8080/ -H 'Content-Type: application/json' -H 'X-TenantID: test2'
  • curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -H 'X-TenantID: test3' -d '{"firstName":"working","username":"wangsoft","lastName":"now"}'
  • curl -X GET http://localhost:8080/ -H 'Content-Type: application/json' -H 'X-TenantID: test3'

Refer:

About

Demonstrates the discriminator field (shared schema) based multi-tenant application using Spring Boot & Hibernate 5.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%