【问题标题】:Need to change properties in JPA entity associated with populated database需要更改与填充数据库关联的 JPA 实体中的属性
【发布时间】:2020-10-03 23:56:25
【问题描述】:

我有一个 Spring MVC/Hibernate 应用程序,当前有一个基于此实体的填充 H2 数据库表:

//annotations...
public class AnEntity implements Serializable {

    //ID...

    private String date_1;

    private String date_2;

    // Other properties

    // getters, setters, etc...

我需要让实体字符串对象为 LocalDate 对象,并且可比较的 db char 列为日期类型。

我查看了但找不到有关如何最好地做到这一点的信息。谁能告诉我我的选择是什么?

我是否需要使用我需要的属性类型创建另一个实体,让应用程序创建新表,然后将我现有的表复制到新表(通过 h2-console 并将 char 转换为日期?或编写应用程序代码转换类型然后插入新表?)

我担心如果我只是更改现有实体中的属性类型,我会丢失我的数据。

我的休眠 hbm2ddl.auto 属性当前设置为“更新”。

【问题讨论】:

    标签: hibernate spring-mvc jpa h2


    【解决方案1】:

    如果您害怕丢失数据,则不应使用 H2 数据库。 H2主要用作内存数据库,这意味着它将数据存储在内存中,不会将数据持久化到磁盘上。

    从 Java 8 开始,新的 Java 日期和时间 API 可用于处理实体中的时间值。 java.time 包中的类型直接映射到相应的 SQL 类型。所以不需要显式指定@Temporal 注解:

    LocalDate 映射到 DATE。 LocalTime 和 OffsetTime 映射到 TIME 立即的。 LocalDateTime、OffsetDateTime 和 ZonedDateTime 映射到 TIMESTAMP

    这意味着我们只能用@Basic(或@Column)注解来标记这些字段,像这样:

    @Basic
    private java.time.LocalDate date_1;
    

    如果您的 hibernate hbm2ddl.auto 属性设置为“更新”,则将通过将现有数据库架构与实体映射进行比较来更新数据库架构。

    但如果您想要持久数据,我的建议是维护数据库的 SQL Schema 文件,创建 SQL 补丁并且不要让 hibernate 管理您的数据库模式(创建/更改)。

    【讨论】:

    • @antione.lange:太棒了,它允许您更改属性类型。也感谢其他提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2015-12-23
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多