【发布时间】:2019-08-09 15:45:13
【问题描述】:
我需要一个概念来设计一个使用 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 不兼容。
任何人都可以根据我给出的描述提出一些方法,如果需要其他信息,请告诉我。
【问题讨论】:
-
“但是,我担心的是,如果一些复杂的查询需要手动编写,我如何使它与其他数据库兼容” 非常大的问题,这很可能需要SQL transpiler
-
@RaymondNijland 方法对您来说看起来不错?请建议。或任何其他不需要 SQL 转译器的方式。
-
我想如果你编写 MySQL 代码
SELECT MD5(..)并且你需要它用于 SQL Server (MSSQL) 它将是SELECT HASHBYTES('md5', ..)这是一个简单的源到源转换,对于更难的事情,您还必须用 PHP 或 SQL 编写解释器来处理其他 RDMS 可能支持的更复杂的情况。.. -
@RaymondNijland 这对我来说看起来很复杂。在检测我们正在为使用本机 sql 或类似的东西不兼容的数据库生成查询特定的配置文件时会怎么样??
-
“对我来说它看起来很复杂。” 是的,为什么你认为大多数框架都保持 ANSI/ISO SQL 标准或支持一个 RDMS 系统...问题开始于您需要使用 SQL 方言(特定供应商扩展)
标签: java spring hibernate spring-boot spring-data-jpa