Advertisement
Guest User

Untitled

a guest
Aug 16th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.35 KB | None | 0 0
  1. /*
  2. * Copyright 2018 onwards - Sunit Katkar (sunitkatkar@gmail.com)
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.sunitkatkar.blogspot.tenant.config;
  17.  
  18. import java.util.HashMap;
  19. import java.util.Map;
  20.  
  21. import javax.persistence.EntityManagerFactory;
  22.  
  23. import org.hibernate.MultiTenancyStrategy;
  24. import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
  25. import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
  26. import org.slf4j.Logger;
  27. import org.slf4j.LoggerFactory;
  28. import org.springframework.beans.factory.annotation.Qualifier;
  29. import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  30. import org.springframework.context.annotation.Bean;
  31. import org.springframework.context.annotation.ComponentScan;
  32. import org.springframework.context.annotation.Configuration;
  33. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  34. import org.springframework.orm.jpa.JpaTransactionManager;
  35. import org.springframework.orm.jpa.JpaVendorAdapter;
  36. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  37. import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
  38. import org.springframework.transaction.annotation.EnableTransactionManagement;
  39.  
  40. import com.sunitkatkar.blogspot.tenant.model.User;
  41. import com.sunitkatkar.blogspot.tenant.repository.UserRepository;
  42. import com.sunitkatkar.blogspot.tenant.service.UserService;
  43.  
  44. /**
  45. * This is the tenant data sources configuration which sets up the multitenancy.
  46. *
  47. * @author Sunit Katkar, sunitkatkar@gmail.com
  48. * (https://sunitkatkar.blogspot.com/)
  49. * @since ver 1.0 (May 2018)
  50. * @version 1.0
  51. */
  52. @Configuration
  53. @EnableTransactionManagement
  54. @ComponentScan(basePackages = { "com.sunitkatkar.blogspot.tenant.repository",
  55. "com.sunitkatkar.blogspot.tenant.model" })
  56. @EnableJpaRepositories(basePackages = {
  57. "com.sunitkatkar.blogspot.tenant.repository",
  58. "com.sunitkatkar.blogspot.tenant.service" },
  59. entityManagerFactoryRef = "tenantEntityManagerFactory",
  60. transactionManagerRef = "tenantTransactionManager")
  61. public class TenantDatabaseConfig {
  62.  
  63. private static final Logger LOG = LoggerFactory
  64. .getLogger(TenantDatabaseConfig.class);
  65.  
  66.  
  67. @Bean(name = "tenantJpaVendorAdapter")
  68. public JpaVendorAdapter jpaVendorAdapter() {
  69. return new HibernateJpaVendorAdapter();
  70. }
  71.  
  72. @Bean(name = "tenantTransactionManager")
  73. public JpaTransactionManager transactionManager(
  74. EntityManagerFactory tenantEntityManager) {
  75. JpaTransactionManager transactionManager = new JpaTransactionManager();
  76. transactionManager.setEntityManagerFactory(tenantEntityManager);
  77. return transactionManager;
  78. }
  79.  
  80. /**
  81. * The multi tenant connection provider
  82. *
  83. * @return
  84. */
  85. @Bean(name = "datasourceBasedMultitenantConnectionProvider")
  86. @ConditionalOnBean(name = "masterEntityManagerFactory")
  87. public MultiTenantConnectionProvider multiTenantConnectionProvider() {
  88. // Autowires the multi connection provider
  89. return new DataSourceBasedMultiTenantConnectionProviderImpl();
  90. }
  91.  
  92. /**
  93. * The current tenant identifier resolver
  94. *
  95. * @return
  96. */
  97. @Bean(name = "currentTenantIdentifierResolver")
  98. public CurrentTenantIdentifierResolver currentTenantIdentifierResolver() {
  99. return new CurrentTenantIdentifierResolverImpl();
  100. }
  101.  
  102. /**
  103. * Creates the entity manager factory bean which is required to access the
  104. * JPA functionalities provided by the JPA persistence provider, i.e.
  105. * Hibernate in this case.
  106. *
  107. * @param connectionProvider
  108. * @param tenantResolver
  109. * @return
  110. */
  111. @Bean(name = "tenantEntityManagerFactory")
  112. @ConditionalOnBean(name = "datasourceBasedMultitenantConnectionProvider")
  113. public LocalContainerEntityManagerFactoryBean entityManagerFactory(
  114. @Qualifier("datasourceBasedMultitenantConnectionProvider")
  115. MultiTenantConnectionProvider connectionProvider,
  116. @Qualifier("currentTenantIdentifierResolver")
  117. CurrentTenantIdentifierResolver tenantResolver) {
  118.  
  119. LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
  120. //All tenant related entities, repositories and service classes must be scanned
  121. emfBean.setPackagesToScan(
  122. new String[] { User.class.getPackage().getName(),
  123. UserRepository.class.getPackage().getName(),
  124. UserService.class.getPackage().getName() });
  125. emfBean.setJpaVendorAdapter(jpaVendorAdapter());
  126. emfBean.setPersistenceUnitName("tenantdb-persistence-unit");
  127. Map<String, Object> properties = new HashMap<>();
  128. properties.put(org.hibernate.cfg.Environment.MULTI_TENANT,
  129. MultiTenancyStrategy.SCHEMA);
  130. properties.put(
  131. org.hibernate.cfg.Environment.MULTI_TENANT_CONNECTION_PROVIDER,
  132. connectionProvider);
  133. properties.put(
  134. org.hibernate.cfg.Environment.MULTI_TENANT_IDENTIFIER_RESOLVER,
  135. tenantResolver);
  136. // ImprovedNamingStrategy is deprecated and unsupported in Hibernate 5
  137. // properties.put("hibernate.ejb.naming_strategy",
  138. // "org.hibernate.cfg.ImprovedNamingStrategy");
  139. properties.put(org.hibernate.cfg.Environment.DIALECT,
  140. "org.hibernate.dialect.MySQL5Dialect");
  141. properties.put(org.hibernate.cfg.Environment.SHOW_SQL, true);
  142. properties.put(org.hibernate.cfg.Environment.FORMAT_SQL, true);
  143. properties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, "update");
  144.  
  145. emfBean.setJpaPropertyMap(properties);
  146. LOG.info("tenantEntityManagerFactory set up successfully!");
  147. return emfBean;
  148. }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement