Java SpringBoot、Hibernate和flyway数据库问题
更新了rieckpil建议 嗨 现在我面临一个问题,只有当我使用Crudepository从H2 DB添加/读取实体时才会出现这个问题 这是一个非常基本的例子: 我的属性: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
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”);
添加到我的空数据库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注释的附带信息,这对我的改进很有用!有点离题,但您有没有一个好的来源来了解这些更改这