Spring Boot: настройка стратегии именования Hibernate с помощью @DataJpaTest и Flyway - PullRequest
0 голосов
/ 11 февраля 2019

Я заметил странное поведение при попытке использовать аннотацию @DataJpaTest в тесте Spring Boot, в котором также используется Flyway.

Дан следующий класс сущностей:

@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, или создаю bean-объект PhysicalNamingStrategy ... ничего не влияет наповедение.Как я могу сказать JPA в этом тестовом контексте, что я хочу использовать SpringPhysicalNamingStrategy, который отображает «columnA» в «column_a»?

...