我想要两个配置文件,一个是 MySQL 数据源,另一个是 H2 数据源。 所以我创建了
application.properties:
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.datasource.url=jdbc:mysql://localhost:3306/boilerplate_springboot_restapi
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
和
application-test.properties:
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=admin
spring.datasource.password=admin
我使用选项 -Dspring.profiles.active=test 来运行带有测试配置文件的应用程序。
有趣的是,测试配置文件似乎选择了 H2 数据源,而不是方言,所以它崩溃了。如果我将 H2 配置放在 application.properties 中,它就可以正常工作。
这里是运行测试配置文件的日志:
[ restartedMain] c.b.r.SpringBoot2RestServiceApplication : The following profiles are active: test
...
[ restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb'
[ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
[ task-1] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.17.Final
[ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
[ task-1] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
[ task-1] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
...
Hibernate: drop table if exists book
Hibernate: drop table if exists hibernate_sequence
Hibernate: create table book....
[ task-1] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "create table book
我相信错误的休眠方言是崩溃的根本原因。但我不明白我做错了什么。
更新: 如果我在 application.properties 中设置 H2Dialect,它会正确地选择它...... 就像主文件中的设置优先于配置文件属性文件中的设置...
更新: 我在代码和 pom.xml 中都没有任何 @Profile
更新: 我创建了两个属性文件,一个用于 MySQL,一个用于 h2,并将所有属性移动到那里。现在它似乎起作用了。
我发现此 Spring MVC application.properties not override by profile file application-dev.properties
存在类似问题答案 0 :(得分:2)
您的生产配置使用
from datetime import date
def formatted_date(year, month) -> str:
return date(year, month, last_day(month, year)).strftime("%d/%m/%y")
print(fotmatted_date(1985, 1))
# 31/01/85
print(formatted_date(1984, 2))
# 29/02/84
而您的测试配置使用
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
由于两者都存在,第一个将获胜(因为属性对象设置为最后一个)。所以在两个文件中使用相同的名称。