1 package com.supwisdom.multitenant.datasource.config;
4 import com.supwisdom.multitenant.MultiTenantAutoConfiguration;
5 import lombok.extern.slf4j.Slf4j;
6 import org.hibernate.MultiTenancyStrategy;
7 import org.hibernate.cfg.Environment;
8 import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
9 import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
12 import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
13 import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
14 import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
15 import org.springframework.context.annotation.Bean;
16 import org.springframework.context.annotation.Configuration;
17 import org.springframework.orm.jpa.JpaVendorAdapter;
18 import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
19 import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
21 import javax.sql.DataSource;
22 import java.util.HashMap;
26 @ConditionalOnBean({MultiTenantAutoConfiguration.class})
28 public class MutliTenantHibernateConfig {
30 private final JpaProperties jpaProperties;
32 private final HibernateProperties hibernateProperties;
34 public MutliTenantHibernateConfig(@Autowired JpaProperties jpaProperties,
35 HibernateProperties hibernateProperties) {
36 this.jpaProperties = jpaProperties;
37 this.hibernateProperties = hibernateProperties;
41 public JpaVendorAdapter getJpaVendorAdapter() {
42 HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
43 adapter.setGenerateDdl(true);
47 @Bean("entityManagerFactory")
48 public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource,
49 MultiTenantConnectionProvider multiTenantConnectionProvider,
50 CurrentTenantIdentifierResolver currentTenantIdentifierResolver) {
51 Map<String, Object> properties = new HashMap<>();
52 properties.putAll(hibernateProperties
53 .determineHibernateProperties(jpaProperties.getProperties(),
54 new HibernateSettings()));
55 properties.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
56 properties.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
57 properties.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver);
59 LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
60 em.setDataSource(dataSource);
61 em.setPackagesToScan("com.supwisdom");
62 em.setJpaPropertyMap(properties);
63 em.setJpaVendorAdapter(getJpaVendorAdapter());
64 log.info("setup multi-tenant entityManagerFactor");