Java SpringBoot、Hibernate和flyway数据库问题

Java SpringBoot、Hibernate和flyway数据库问题,java,hibernate,spring-boot,h2,flyway,Java,Hibernate,Spring Boot,H2,Flyway,更新了rieckpil建议 嗨 现在我面临一个问题,只有当我使用Crudepository从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 sp

更新了rieckpil建议

现在我面临一个问题,只有当我使用Crudepository从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
如果我要使用CRUDepository,我会遇到例外情况

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
原因:javax.persistence.PersistenceException:[PersistenceUnit:default]无法构建Hibernate SessionFactory;嵌套异常为org.hibernate.tool.schema.spi.SchemaManagementException:schema验证:表[user]中缺少列[last_login]

回购

@Repository
public interface UserRepo extends CrudRepository<User, Long> {

}
V1\uuu-baseline.sql(为空,因为它仅用于获取包含用户TestUser的数据库的基线

V2\uu migrate.sql

ALTER TABLE USER ADD COLUMN LASTLOGIN bigint(20) default 0
我的步骤是:

  • 将新用户
    userRepo.save(新用户(“a”);
    添加到我的空数据库
  • 关闭应用程序
  • 将flywaydb依赖项添加到我的pom
  • 创建一个名为
    V1_u-baseline.sql
    的空.sql文件,以利用
    spring.flyway.baseline-on-migrate=true
    并启动应用程序,成功,关机
  • 创建一个名为
    V2\uu migrate.sql的新sql文件,其内容为
    ALTER TABLE USER ADD COLUMN LASTLOGIN bigint(20)默认值为0
  • 然后我将字段
    private long lastLogin;
    添加到类
    User

    当我现在再次启动应用程序时,我得到了上面提到的错误

    原因:javax.persistence.PersistenceException:[PersistenceUnit:default]无法构建Hibernate SessionFactory;嵌套异常为org.Hibernate.tool.schema.spi.SchemaManagementException:schema验证:表[user]中缺少列[last_login]


    那么我做错了什么呢?

    看起来你的Flyway脚本没有被填充。你必须遵循Flyway命名约定,比如
    V01\uu INIT.sql
    (你需要这两个
    ),并将它们存储在
    src/main/resources/db/migration

    在应用程序启动期间,您应该看到Flyway会填充您已经将最新架构应用于数据库的脚本或日志

    您可以在此处找到一个简单的飞行路线示例:


    此外,我建议使用
    spring.jpa.hibernate.ddl auto=validate
    ,以确保只有Flyway创建数据库架构。

    您的类字段名为
    lastLogin
    ,hibernate将其转换为
    last\u login
    ,以在数据库中查找列。您必须指定该字段对应的列o如下所示:

    @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


    您必须使用
    @EnableJpaRepositories
    注释标记您的
    SpringBootServletializer
    类,该注释指示
    Crudepository
    所在的包。

    我根据您的建议更新了我的问题。错误确实发生了变化,但我甚至不知道现在是好是坏。您能更新您的Example吗le类。因为现在有
    lastLogin
    object属性。错误消息说JPA缺少一个数据库列。另外,请将所有Flyway脚本添加到questionDone。lastLogin属性是我要添加到表
    user
    中的列,我建议删除当前数据库(如果可能)然后只使用Flyway初始化数据库模式,并创建一个迁移脚本
    V01\uuuuu init\u USER.sql
    ,在这里初始化整个用户表非常感谢。还有关于@Repository注释的附带信息,这对我的改进很有用!有点离题,但您有没有一个好的来源来了解这些更改这