87be5f6eb7456253fe65496c0a437e4b69cc7c44
[epayment/food_payapi.git] /
1 package com.supwisdom.multitenant.datasource.config;
2
3
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;
20
21 import javax.sql.DataSource;
22 import java.util.HashMap;
23 import java.util.Map;
24
25 @Configuration
26 @ConditionalOnBean({MultiTenantAutoConfiguration.class})
27 @Slf4j
28 public class MutliTenantHibernateConfig {
29
30   private final JpaProperties jpaProperties;
31
32   private final HibernateProperties hibernateProperties;
33
34   public MutliTenantHibernateConfig(@Autowired JpaProperties jpaProperties,
35                                     HibernateProperties hibernateProperties) {
36     this.jpaProperties = jpaProperties;
37     this.hibernateProperties = hibernateProperties;
38   }
39
40   @Bean
41   public JpaVendorAdapter getJpaVendorAdapter() {
42     HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
43     adapter.setGenerateDdl(true);
44     return adapter;
45   }
46
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);
58
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");
65     return em;
66   }
67
68 }