我得到了一个要求,每个公司都有独立的数据库和相同的模式,未来的新公司可能会被添加到相同的模式结构中。我必须基于用户来连接他们的公司模式登录。所以我必须在每次用户登录时连接单独的数据库。我将使用Spring数据JPA来处理连接。只有我将在属性文件中配置新的模式凭证。是否有任何方法可以添加使用动态数据库模式相同的模型类。所有应该只在运行时发生。spring data jpa(hibernate + spring + jpa)
0
A
回答
1
听起来像你问的是多租户支持。您可以创建一个LocalContainerEntityManagerFactoryBean
是这样的:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource,
MultiTenantConnectionProvider multiTenantConnectionProvider,
CurrentTenantIdentifierResolver tenantIdentifierResolver) {
LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
emfBean.setDataSource(dataSource);
emfBean.setPackagesToScan(Application.class.getPackage().getName());
emfBean.setJpaVendorAdapter(jpaVendorAdapter());
Map<String, Object> jpaProperties = new HashMap<>();
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
// Improved naming strategy deprecated as of hibernate 5.0
// jpaProperties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
jpaProperties.put("hibernate.implicit_naming_strategy", "org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl");
jpaProperties.put("hibernate.physical_naming_strategy", "com.example.config.HibernateLegacyImprovedNamingStrategy");
jpaProperties.put("hibernate.show_sql", "true");
jpaProperties.put("hibernate.format_sql", "true");
jpaProperties.put(org.hibernate.cfg.Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
jpaProperties.put(org.hibernate.cfg.Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
jpaProperties.put(org.hibernate.cfg.Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantIdentifierResolver);
emfBean.setJpaPropertyMap(jpaProperties);
return emfBean;
}
,并提供MultiTenantConnectionProvider
和CurrentTenantIdentifierResolver
实现作为一个例子,对于模式的租赁,在CurrentTenantIdentifierResolver
可以查找从会话当前用户确定什么模式来使用。
MultiTenantConnectionProvider
可能会在返回连接使用(并在返回时重置)之前使用类似SELECT set_schema_to(?)
的命令更改连接。
@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
final Connection connection = getAnyConnection();
setSchemaTo(connection, tenantIdentifier);
return connection;
}
您需要阅读有关多租户的信息,并了解您希望使用哪种实现方式。
+0
嗨格伦谢谢,我认为这将解决我的问题。我会试一试。 –
相关问题
- 1. Hibernate | Spring Data JPA | @OneToOne
- 2. Spring Data JPA 1.9.2 + Hibernate 4.3+ Issue
- 3. Spring JPA Hibernate Vs Spring Hibernate
- 4. Extjs + Spring + JPA + HIbernate
- 5. flex spring jpa hibernate
- 6. Spring + Hibernate + JPA
- 7. Spring Boot + JPA + Hibernate - BeanCreationException
- 8. Spring Data JPA和QueryDSL
- 9. @ManyToMany Spring Data JPA Pageable
- 10. Spring Data Jpa - 缓存
- 11. Spring Data Jpa入门
- 12. Spring Jpa Data Page PageRequest
- 13. Spring Data JPA @EnableJpaRepositories TypeNotPresentExceptionProxy
- 14. Spring Data JPA,Hibernate Vendor,Multi-Tenancy和Postgres SQL
- 15. Spring Data JPA需要Eclipse链接和Hibernate?
- 16. Hibernate Inheritance strategy = InheritanceType.JOINED&onetoMany with spring-data-jpa
- 17. Hibernate + Spring Data JPA二级缓存XML
- 18. Hibernate 4.3.0.Final&Spring Data JPA 1.4.3.RELEASE
- 19. Spring 3 + Hibernate + JPA + Spring Security 3.1
- 20. 加入spring-data-rest ontop spring-data-jpa
- 21. Spring jpa hibernate insert OneToMany
- 22. spring-data-jpa和spring-boot-starter-data-jpa之间的区别
- 23. 审计+ spring-boot-data-jpa + Hibernate + JPA 2事务性异常
- 24. Spring Data-JPA与JPA:有什么区别?
- 25. Spring,JPA,Hibernate,Jetty 7集成
- 26. Spring JPA Data的仓库
- 27. SPRING DATA-JPA + eclipseLink2.0失败
- 28. Modelbase(继承)Spring Data JPA
- 29. Spring Data JPA findOne返回null
- 30. Spring Data @Version with JPA @Version
难道你不能为每个公司有不同的模式,都在一个数据库中吗?我认为这会容易得多 –
是的,这可能是可能的。但我的问题是连接不同的架构与弹簧数据jpa。我将如何实现这一点,由于架构可能会动态添加。弹簧需要在配置时间只。 –