spring-boot - Spring Boot:使用 @DataJpaTest 和 Flyway 设置 Hibernate 命名策略
问题描述
尝试在也使用 Flyway 的 Spring Boot 测试中使用 @DataJpaTest 注释时,我注意到了一个奇怪的行为。
给定以下实体类:
@Entity
public class MyEntity {
@Id
private String columnA;
private String columnB;
public String getColumnA() {
return columnA;
}
public void setColumnA(String columnA) {
this.columnA = columnA;
}
public String getColumnB() {
return columnB;
}
public void setColumnB(String columnB) {
this.columnB = columnB;
}
}
以下 Spring 存储库:
@Repository
public interface MyEntityRepository extends JpaRepository<MyEntity, String> {
}
以下测试:
@RunWith(SpringRunner.class)
@DataJpaTest
public class JpaTestApplicationTests {
@Autowired
MyEntityRepository myEntityRepository;
@Test
public void canSaveAndFetch() {
MyEntity myEntity = new MyEntity();
myEntity.setColumnA("a");
myEntity.setColumnB("b");
myEntityRepository.save(myEntity);
Optional<MyEntity> myEntityOptional = myEntityRepository.findById("a");
Assert.assertTrue(myEntityOptional.isPresent());
}
}
测试本身可以正常工作,因为 auto-ddl 已打开并且 H2 正在创建表。
但是,如果我想定义自己的模式,那么我将 Flyway 添加到 POM 并创建迁移,例如在 resources/db/migration/V1__Schema.sql 中:
CREATE TABLE my_entity (
column_a VARCHAR NOT NULL PRIMARY KEY,
column_b VARCHAR
);
现在同样的测试将失败,因为 JPA 不再使用默认的 SpringPhysicalNamingStrategy。
引起:org.h2.jdbc.JdbcSQLException:找不到列“MYENTITY0_.COLUMNA”
通过设置这似乎是一个简单的修复
spring.jpa.hibernate.naming.physical-strategy = org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
但是,无论我把它放在 application.properties 中,还是放在 @TestPropertySource 中,或者创建一个 PhysicalNamingStrategy bean ......都不会影响行为。如何在此测试上下文中告诉 JPA 我想使用将“columnA”映射到“column_a”的 SpringPhysicalNamingStrategy?
解决方案
我有类似的问题 - 此属性 ( spring.jpa.hibernate.naming.physical-strategy
) 被忽略(与其他spring.jpa.hibernate
属性一起)。这是由扩展org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration
并覆盖了 class 方法protected Map<String, Object> getVendorProperties()
的类引起的org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration
。删除该类(毕竟这不是必需的)解决了问题并允许HibernateJpaConfiguration
该类应用配置文件中的所有属性。
推荐阅读
- mysql - 使用变量时如何在查询中使用 GROUP BY
- python - 这是一个 distutils 安装的项目,因此我们无法准确确定哪些文件属于它,这只会导致部分卸载
- javascript - Scrapy:从脚本标签中提取数据
- selenium - Jenkins - 显示失败测试的名称 TestNG
- mysql - HAProxy 中的 2 个 mySQL 集群
- android - 如何从我的应用程序中打开标准的谷歌地图应用程序,然后选择一个位置然后重定向回我的应用程序?
- scala - 如何在Scala中用空格替换双引号
- sql - 用于识别已预订住宿的 SQL 查询
- google-cloud-platform - 如何在 istio 服务上创建入口以运行 Anthos(knative)
- python - 如何将置信区间添加到 PsychoPy RatingScale?