java - 多数据库应用 SpringBoot , Hibernate 和 JPA
问题描述
我需要一个概念来设计一个使用 Spring boot、Hibernate 和 JPA 的多数据库应用程序。
现在我正在考虑支持 4 个关系数据库(Mysql、H2、SQLLite、Oracle)。
我正在做的是使用 Spring Boot 配置文件功能选择正确的数据库配置文件,然后加载相关的数据库属性。
## application-h2.properties
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect
# application-mysql.properties
# MySQL-Database
#spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ntk?autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
然后在 application.properties
spring.profiles.active=h2
在这里,应用程序将运行并加载 h2 数据库的属性。同样我们可以选择配置文件作为 Mysql,它将加载 Mysql 相关的属性。
在这里,几乎每个查询都是由 JPA 基于方言生成的。它与所有数据库兼容(因为,有时我们会根据选择的配置文件为一个数据库运行此应用程序)。但是,我担心的是,如果需要手动编写一些复杂的查询,我如何才能使其兼容其他数据库。假设某些为 Mysql 设计的查询可能与 Oracle 不兼容。
任何人都可以根据我给出的描述提出一些方法,如果需要其他信息,请告诉我。
解决方案
鉴于您已经为每个不同的数据库定义了不同的配置文件,为什么不创建一个 bean 来封装所有这些“更高级”的查询并使用 @profile 对其进行注释,以便根据所选配置文件实际使用正确的配置文件?
创建一个接口,为您可能需要的每个高级查询声明一个方法:
public interface IAdvancedQuery {
void advancedQuery1();
void advancedQuery2();
...
}
然后,为每个配置文件创建一个实现此接口的 bean 并相应地对其进行注释:
@Profile("h2")
@Component
public class H2Queries implements IAdvancedQuery {
@Override
public void query1() {
// your h2 specific query goes here
}
@Override
public void query2() {
...
}
...
}
@Profile("mysql")
@Component
public class MysqlQueries implements IAdvancedQuery {
@Override
public void query1() {
// your mySQL specific query goes here
}
@Override
public void query2() {
...
}
...
}
最后,假设您有一个消费者服务类,您只需使用 @Autowired 注入适当的 bean,根据您在 spring 应用程序中指定的配置文件自动注入:
@Service
public class ConsumerService {
@Autowired
public IAdvancedQuery advancedQuery;
...
public void someMethod() {
// do something with the advanced query
advancedQuery.query1();
...
}
...
}
最终将根据配置文件和 bean 实例化选择正确的“高级查询”方法。
推荐阅读
- php - Laravel 中的 XSRF 令牌验证失败
- java - JPA 存储库保存方法在 MySQL 中插入 NULL 值,而不是 json 请求提供的值
- java - Hibernate 不在二级 Hazelcast 缓存中存储实体
- r - 如何使用 R 提取数据?
- php - webrtc 在基于 php 的页面中带有 node.js
- r - 在 R Shiny 中完成 100% 后,是否可以关闭或删除 shinyWidgets 的进程栏?
- python - 安装 opencv 失败 - 粘贴 CMakeError.log 的内容
- node.js - 通过 puppeteer 设置浏览器配置文件设置
- ios - 为什么 'textViewDidChangeSelection' 方法在 Swift 中陷入无限循环?
- android - BiometricPrompt Android:软件或安全更新后三星出现 UnrecoverableKeyException