更新了 rieckpil 建议你好,现在我面临一个只有在我使用 CrudRepository 从 H2 DB 添加/读取实体时才会出现的问题。一个非常基本的例子,它有效:我的属性:spring.datasource.url=jdbc:h2:file:~/flyawayTest;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUEspring.datasource.username=adminspring.datasource.password=passwordspring.datasource.driver-class-name=org.h2.Driverspring.h2.console.enabled=truespring.h2.console.path=/h2spring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=validatespring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialectspring.flyway.baseline-on-migrate = true和一个示例类@Entity@Datapublic 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 0V1__baseline.sql(为空,因为它仅用于获取包含用户 TestUser 的数据库的基线V2__migrate.sqlALTER TABLE USER ADD COLUMN LASTLOGIN bigint(20) default 0我的步骤是:将新用户添加userRepo.save(new User("A"));到我的空数据库关机申请将 flywaydb 依赖添加到我的 pom创建一个空的 .sql 文件以V1__baseline.sql使用spring.flyway.baseline-on-migrate = true并启动应用程序,成功,关闭创建一个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]那么我在这里做错了什么?
2 回答
饮歌长啸
TA贡献1951条经验 获得超3个赞
您的类字段名为 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。
添加回答
举报
0/150
提交
取消