обновлено с предложением rieckpil
Привет,
сейчас я сталкиваюсь с проблемой, которая появляется только тогда, когда я использую CrudRepository для добавления / чтения сущностей изH2 DB.
Очень простой пример, который работает:
Мои свойства :
spring.datasource.url=jdbc:h2:file:~/flyawayTest;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE
spring.datasource.username=admin
spring.datasource.password=password
spring.datasource.driver-class-name=org.h2.Driver
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.flyway.baseline-on-migrate = true
и пример класса
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
public User() {
}
public User(String username) {
this.username = username;
}
public User(String username, long lastLogin) {
this.username = username;
//this.lastLogin = lastLogin;
}
}
Использование этого .sql файла
CREATE TABLE USER (
ID bigint(20) NOT NULL AUTO_INCREMENT,
USERNAME varchar(100) NOT NULL,
PRIMARY KEY (ID)
);
insert into USER (USERNAME) values ('User');
ALTER TABLE USER ADD COLUMN LASTLOGIN bigint(20) default 0
Если я собираюсь работать с репозиторием Crud, я получил исключение :
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [last_login] in table [user]
Репо
@Repository
public interface UserRepo extends CrudRepository<User, Long> {
}
Хелпер-класс для проверки этой процедуры
@Component
public class UCML implements CommandLineRunner {
private final UserRepo userRepo;
public UCML(UserRepo userRepo) {
this.userRepo = userRepo;
}
@Override
public void run(String... args) throws Exception {
userRepo.save(new User("TestUser"));
userRepo.findAll().forEach(System.out::println);
}
}
V1__baseline.sql (пусто, поскольку используется только для получения базовой линии БД с состоящим пользователем TestUser
V2__migrate.sql
ALTER TABLE USER ADD COLUMN LASTLOGIN bigint(20) default 0
Мои шаги:
- Добавление нового пользователя
userRepo.save(new User("A"));
в мою пустую базу данных - Завершение работы приложения
- Добавление зависимости flywaydb к моему pom
- создать пустой файл .sql с именем
V1__baseline.sql
чтобы использовать spring.flyway.baseline-on-migrate = true
и запустить приложение, успех, завершение работы - создать новый файл sql с именем
V2__migrate.sql
с содержимым ALTER TABLE USER ADD COLUMN LASTLOGIN bigint(20) default 0
, затем я добавляю полеprivate long lastLogin;
в класс User
.
Когда я сейчас запускаю приложение снова, я получаю ошибку, о которой я упоминал выше
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [last_login] in table [user]
Так что я тут не так делаю?