针对相同模式的多个JPA存储库

时间:2017-06-29 01:14:06

标签: java spring hibernate spring-boot spring-data-jpa

我有一个应用程序,根据它的部署配置,可以将相同的数据写入一个或多个具有相同模式的数据库。基本上认为它就像A环境和B环境一样,在A中我们写入A和B数据库,以便那里有来自两个环境的数据。

进一步混淆问题的是环境中的数据库可能(通常也有)具有不同的模式。虽然它们的不同之处在于可能已经对A进行了更改,但尚未对B进行更改。

目前我正在通过创建基本"实体"来处理这个问题。 pojos匹配表结构,然后为每一方编写特定的JDBC查询,然后根据配置检查有条件地运行它们。

我希望能够使用像spring jpa来处理所有查询并允许我做一些DI进行测试,但我能看到的唯一方法是基本上创建一个单独的存储库" AXyzRepository& #34;和" BXyzRepository"对于每个实体,甚至可能是不同模式的不同实体。

有没有办法告诉存储库喜欢"嘿,这次我想让你使用/ this / ConfigurationProperty"管他呢?并忽略实体中任何缺失的字段?

1 个答案:

答案 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文件夹中为devprod配置文件创建两个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文件(适用于h2mysql平台):

<强>架构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