Spring Boot:使用@DataJpaTest和Flyway设置Hibernate命名策略

时间:2019-02-11 19:04:06

标签: spring-boot jpa junit h2 flyway

当在也使用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”?

1 个答案:

答案 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 类应用配置文件中的所有属性。