Я заметил странное поведение при попытке использовать аннотацию @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»?