我有一个使用JPA和Hibernate运行的Spring Boot应用程序,以自动管理我的实体。创建此应用程序时,我使用了不支持Java 8 DateTime API的JPA较旧版本。但是,由于没有很多有关JPA的知识,我在实体中使用了LocalDateTime
并成功了!不必了解底层数据库结构真是太好了!
直到现在...
我将JPA升级到不支持LocalDateTime
的版本,并且JPA使用此字段的方式遇到错误。它曾经将该对象保存为我的MySQL数据库中的VARBINARY
(tinyblob)字段,但是现在它很聪明,希望它是TIMESTAMP
类型。这意味着当我使用配置spring.jpa.hibernate.ddl-auto=validate
启动应用程序时,出现错误:
...
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException:
Schema-validation: wrong column type encountered in column [answer_time] in table [user_answer];
found [tinyblob (Types#VARBINARY)], but expecting [datetime (Types#TIMESTAMP)]
所以现在我有点不知道如何将这些字段转换为新的时间戳类型。我当时正在考虑使用FlyWay编写迁移脚本,但是我不知道JPA如何将对象存储为Blob。当将VARBINARY
字段打印为字符串时,其外观如下:
’ sr
java.time.Ser]º"H² xpw ã
!;:;Ö@x
这是我的实体的外观(升级期间未更改)
@Entity
@Table(name = "user_answer")
public class UserAnswer {
private Long id;
private LocalDateTime answerTime;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public LocalDateTime getAnswerTime() {
return answerTime;
}
public void setAnswerTime(LocalDateTime answerTime) {
this.answerTime = answerTime;
}
}
如何更新数据库,以便将用于存储VARBINARY
数据的旧LocalDateTime
字段转换为TIMESTAMP
字段?
答案 0 :(得分:1)
我将尝试的操作(备份数据库之后!):
LocalDateTime
字段。java.sql.Date
字段。确保正确注释它等,以便Hibernate确切知道应如何定义列。LocalDateTime
,将其转换并存储到DateTime
字段merge()
中。DateTime
字段。LocalDateTime
的列。DateTime
字段的类型更改为LocalDateTime
。DateTime
存储为TIMESTAMP
。LocalDateTime
。也请考虑使用ZonedDateTime
而不是LocalDateTime
。