Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.03 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.meineDomain.tenancy.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.beans.factory.annotation.Value;
  30. import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  31. import org.springframework.context.annotation.Bean;
  32. import org.springframework.context.annotation.ComponentScan;
  33. import org.springframework.context.annotation.Configuration;
  34. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  35. import org.springframework.orm.jpa.JpaTransactionManager;
  36. import org.springframework.orm.jpa.JpaVendorAdapter;
  37. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  38. import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
  39. import org.springframework.transaction.annotation.EnableTransactionManagement;
  40.  
  41. import com.meineDomain.model.i2s.Brand;
  42. import com.meineDomain.model.tenancy.MasterTenant;
  43. import com.meineDomain.tenancy.master.repository.MasterTenantRepository;
  44.  
  45. /**
  46. * This is the tenant data sources configuration which sets up the multitenancy.
  47. *
  48. * @author Sunit Katkar, sunitkatkar@gmail.com
  49. * (https://sunitkatkar.blogspot.com/)
  50. * @since ver 1.0 (May 2018)
  51. * @version 1.0
  52. */
  53. @Configuration
  54. @EnableTransactionManagement
  55. @ComponentScan(basePackages = { "com.meineDomain.tenancy.tenant.repository", "com.meineDomain.tenancy.tenant.model" })
  56. @EnableJpaRepositories(basePackages = { "com.meineDomain.tenancy.repositories", "com.meineDomain.tenancy.tenant.repository",
  57. "com.meineDomain.tenancy.tenant.service" }, entityManagerFactoryRef = "tenantEntityManagerFactory", transactionManagerRef = "tenantTransactionManager")
  58. public class TenantDatabaseConfig {
  59.  
  60. private static final Logger LOG = LoggerFactory.getLogger(TenantDatabaseConfig.class);
  61.  
  62. @Value("${spring.jpa.properties.hibernate.show_sql}")
  63. boolean show_sql;
  64.  
  65. @Bean(name = "tenantJpaVendorAdapter")
  66. public JpaVendorAdapter jpaVendorAdapter() {
  67. return new HibernateJpaVendorAdapter();
  68. }
  69.  
  70. @Bean(name = "tenantTransactionManager")
  71. public JpaTransactionManager transactionManager(@Qualifier("tenantEntityManagerFactory") EntityManagerFactory tenantEntityManager) {
  72. JpaTransactionManager transactionManager = new JpaTransactionManager();
  73. transactionManager.setEntityManagerFactory(tenantEntityManager);
  74. return transactionManager;
  75. }
  76.  
  77. /**
  78. * The multi tenant connection provider
  79. *
  80. * @return
  81. */
  82. @Bean(name = "datasourceBasedMultitenantConnectionProvider")
  83. @ConditionalOnBean(name = "masterEntityManagerFactory")
  84. public MultiTenantConnectionProvider multiTenantConnectionProvider() {
  85. // Autowires the multi connection provider
  86. return new DataSourceBasedMultiTenantConnectionProviderImpl();
  87. }
  88.  
  89. /**
  90. * The current tenant identifier resolver
  91. *
  92. * @return
  93. */
  94. @Bean(name = "currentTenantIdentifierResolver")
  95. public CurrentTenantIdentifierResolver currentTenantIdentifierResolver() {
  96. return new CurrentTenantIdentifierResolverImpl();
  97. }
  98.  
  99. /**
  100. * Creates the entity manager factory bean which is required to access the
  101. * JPA functionalities provided by the JPA persistence provider, i.e.
  102. * Hibernate in this case.
  103. *
  104. * @param connectionProvider
  105. * @param tenantResolver
  106. * @return
  107. */
  108. @Bean(name = "tenantEntityManagerFactory")
  109. @ConditionalOnBean(name = "datasourceBasedMultitenantConnectionProvider")
  110. public LocalContainerEntityManagerFactoryBean entityManagerFactory(
  111. @Qualifier("datasourceBasedMultitenantConnectionProvider") MultiTenantConnectionProvider connectionProvider,
  112. @Qualifier("currentTenantIdentifierResolver") CurrentTenantIdentifierResolver tenantResolver) {
  113.  
  114. LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
  115. // All tenant related entities, repositories and service classes must be scanned
  116. emfBean.setPackagesToScan(new String[] { MasterTenantRepository.class.getPackage().getName(), Brand.class.getPackage().getName(),
  117. MasterTenant.class.getPackage().getName() });
  118. emfBean.setJpaVendorAdapter(jpaVendorAdapter());
  119. emfBean.setPersistenceUnitName("tenantdb-persistence-unit");
  120. Map<String, Object> properties = new HashMap<>();
  121. properties.put(org.hibernate.cfg.Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
  122. properties.put(org.hibernate.cfg.Environment.MULTI_TENANT_CONNECTION_PROVIDER, connectionProvider);
  123. properties.put(org.hibernate.cfg.Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantResolver);
  124. // ImprovedNamingStrategy is deprecated and unsupported in Hibernate 5
  125. // properties.put("hibernate.ejb.naming_strategy",
  126. // "org.hibernate.cfg.ImprovedNamingStrategy");
  127. properties.put(org.hibernate.cfg.Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect");
  128. properties.put(org.hibernate.cfg.Environment.SHOW_SQL, show_sql);
  129. properties.put(org.hibernate.cfg.Environment.FORMAT_SQL, show_sql);
  130. // properties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, "update");
  131.  
  132. emfBean.setJpaPropertyMap(properties);
  133. LOG.info("tenantEntityManagerFactory set up successfully!");
  134. return emfBean;
  135. }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement