当在也使用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我想使用SpringPhysicalNamingStrategy来将“ columnA”映射到“ column_a”?
答案 0 :(得分:0)
我遇到了类似的问题 - 此属性 (spring.jpa.hibernate.naming.physical-strategy
) 被忽略(与其他 spring.jpa.hibernate
属性一起)。它是由扩展 org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration
并覆盖 protected Map<String, Object> getVendorProperties()
类中的方法 org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration
的类引起的。删除该类(毕竟没有必要)解决了问题,并允许 HibernateJpaConfiguration
类应用配置文件中的所有属性。