SpringBoot、Hibernate 和 flyway 数据库问题

更新了 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


V1__baseline.sql(为空,因为它仅用于获取包含用户 TestUser 的数据库的基线


V2__migrate.sql


ALTER TABLE USER ADD COLUMN LASTLOGIN bigint(20) default 0

我的步骤是:

  1. 将新用户添加userRepo.save(new User("A"));到我的空数据库

  2. 关机申请

  3. 将 flywaydb 依赖添加到我的 pom

  4. 创建一个空的 .sql 文件以V1__baseline.sql使用spring.flyway.baseline-on-migrate = true并启动应用程序,成功,关闭

  5. 创建一个V2__migrate.sql以内容命名的新 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]

那么我在这里做错了什么?


互换的青春
浏览 139回答 2
2回答

饮歌长啸

您的类字段名为 aslastLogin和 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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java