gpt4 book ai didi

java - Spring Boot、Hibernate 和 flyway 数据库问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:31 28 4
gpt4 key购买 nike

更新了 rieckpil 的建议

你好,

现在我正面临一个问题,该问题仅在我使用 CrudRepository 从 H2 数据库中添加/读取实体时出现。

一个非常基本的例子:

我的属性:

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,我会遇到异常:

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

repo

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

}

Helper-Class 来测试这个程序

@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

我的步骤是:

  1. 添加新用户 userRepo.save(new User("A")); 到我的空数据库
  2. 关机申请
  3. 将 flywaydb 依赖项添加到我的 pom
  4. 创建一个名为 V1__baseline.sql 的空 .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 中。

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

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

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

最佳答案

您的类字段名为 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

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

关于java - Spring Boot、Hibernate 和 flyway 数据库问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52543470/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com