rieckpil提案で更新
こんにちは、
今私は私が読んで/ H2 DBからエンティティを追加するCrudRepositoryを使用していた場合にのみ表示される問題に直面しています。
作品は非常に基本的な例:
私のプロパティ:
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
私はCrudRepository Iで仕事に行きました場合は例外を:
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になるとDBのベースラインを取得するために使用されているので、空であります
V2__migrate.sql
ALTER TABLE USER ADD COLUMN LASTLOGIN bigint(20) default 0
私の手順は次のとおりです。
- 新しいユーザーを追加する
userRepo.save(new User("A"));
私の空のDBへ - シャットダウンアプリケーション
- 私のPOMにflywaydbの依存関係を追加
- 名前の空の.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]
だから私はここで間違って何をすべきか?
あなたのクラスとしてという名前のフィールドlastLogin
とHibernateは、それを翻訳しlast_login
、データベース内の列を見つけること。あなたは、フィールドは、このような手作業に対応する列を指定する必要があります。
@Data
@Entity
@Table(name = "USER", schema = "YOUR_SCHEMA_NAME")
public class User {
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic
@Column(name = "USERNAME", nullable = false)
private String username;
@Basic
@Column(name = "LASTLOGIN")
private Long lastLogin = 0;
}
また、あなたは必要ありません@Repository
もう。
あなたのタグを付けなければならないSpringBootServletInitializer
とクラスを@EnableJpaRepositories
パッケージ示す注釈CrudRepository
位置しています。