我有一个应用程序,根据它的部署配置,可以将相同的数据写入一个或多个具有相同模式的数据库。基本上认为它就像A环境和B环境一样,在A中我们写入A和B数据库,以便那里有来自两个环境的数据。
进一步混淆问题的是环境中的数据库可能(通常也有)具有不同的模式。虽然它们的不同之处在于可能已经对A进行了更改,但尚未对B进行更改。
目前我正在通过创建基本"实体"来处理这个问题。 pojos匹配表结构,然后为每一方编写特定的JDBC查询,然后根据配置检查有条件地运行它们。
我希望能够使用像spring jpa来处理所有查询并允许我做一些DI进行测试,但我能看到的唯一方法是基本上创建一个单独的存储库" AXyzRepository& #34;和" BXyzRepository"对于每个实体,甚至可能是不同模式的不同实体。
有没有办法告诉存储库喜欢"嘿,这次我想让你使用/ this / ConfigurationProperty"管他呢?并忽略实体中任何缺失的字段?
答案 0 :(得分:0)
您可以使用 Spring profiles 设置不同的数据库源,schema.sql(初始化db)和data.sql(以加载初始数据)。
例如,您需要两个配置文件:' dev'和' prod'。在application.properties
中,您将参数spring.profiles.active
设置为prod
值作为默认值(以及两个配置文件通用的其他选项):
<强> application.properties 强>
spring.profiles.active=prod
spring.datasource.initialize=true
spring.jpa.hibernate.ddl-auto=none
然后,在应用application-${profile}.properties
文件夹中为dev
和prod
配置文件创建两个resources
个文件:
<强> application-dev.properties 强>
spring.datasource.url=jdbc:h2:mem:mydb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.platform=h2
<强> application-prod.properties 强>
spring.datasource.url=jdbc:mysql://myhost:3306/mydb
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.platform=mysql
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
然后您必须创建两个schema-${platform}.sql
和两个data-${platform}.sql
文件(适用于h2
和mysql
平台):
<强>架构h2.sql 强>
CREATE TABLE...
...
<强>架构mysql.sql 强>
DROP TABLE...
...
CREATE TABLE...
...
数据-h2.sql 强>
INSERT INTO TABLE...
...
数据-mysql.sql 强>
INSERT INTO TABLE...
...
在您的开发环境中,您可以设置命令行参数-Dspring.profiles.active=dev
(或在IDE中设置它。例如,在InelliJ IDE中,您可以在运行/调试配置对话框中设置Spring配置文件)并使用H2 DB。
将应用程序部署到prod服务器时,它将使用prod
配置文件作为默认值。
更多信息位于documentation。