SpringBoot、Hibernateとフライウェイデシベルの問題

アンナ・クライン:

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

私の手順は次のとおりです。

  1. 新しいユーザーを追加するuserRepo.save(new User("A"));私の空のDBへ
  2. シャットダウンアプリケーション
  3. 私のPOMにflywaydbの依存関係を追加
  4. 名前の空の.sqlファイルの作成V1__baseline.sqlを利用することをspring.flyway.baseline-on-migrate = trueアプリ、成功、シャットダウンを開始
  5. 名前の新しい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]

だから私はここで間違って何をすべきか?

Artiow:

あなたのクラスとしてという名前のフィールド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位置しています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=212678&siteId=1