【问题标题】:Spring boot JPA: remove column on entity changeSpring Boot JPA:删除实体更改列
【发布时间】:2017-12-11 05:55:15
【问题描述】:

我正在尝试使用 spring-boot-starter-data-jpa 从 java 类在 MySQL 数据库中创建表。它工作得很好,除非我在 java 类中更改/删除列名。举个例子:

我有一个名为“Staff”的课程,其中包含 2 个字段:id、name

@Id 
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;

@Column(name = "name", length = 15)
private String name;

public Staff() {
}
// some setter and getter here

当我运行我的项目时,完全按照我的需要生成了一个“员工”表,其中包含 2 列:id、name。问题是如果我像这样将“name”拆分为“firstname”和“lastname”:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;

@Column(name = "firstname", length = 15)
private String firstname;

@Column(name = "lastname", length = 15)
private String lastname;

public Staff() {
}
//some getter and setter here

“员工”表现在包含 4 列(id、name、firstname、lastname)而不是 3。然后我需要自己删除“name”列。反正有没有自动摆脱它?

【问题讨论】:

    标签: java mysql spring hibernate spring-data-jpa


    【解决方案1】:

    看起来你在使用:

     spring.jpa.properties.hibernate.ddl-auto=update
    

    78.1 使用 JPA 初始化数据库

    spring.jpa.generate-ddl (boolean) 开启和关闭功能 独立于供应商。 spring.jpa.hibernate.ddl-auto(枚举)是一个 以更细粒度控制行为的休眠功能 大大地。详情见下文。

    您可以明确设置 spring.jpa.hibernate.ddl-auto 和标准 Hibernate 属性值为 none、validate、update、create、 创建删除。

    如您所见,没有什么新东西(与休眠不同)

    ddl-auto=update - 生成更改它不会删除未映射的列。 例如,您可以有一个包含 10 列的表并且仅映射其中 3 个,在这种情况下,自动模式可能会删除它们,但对于 hibernate/jpa 完整映射表实体不是强制性的。这是 2011 年 11 月创建的 jira 票 Alter and drop columns with hbm2ddl.auto=update,现在状态为“未修复”。

    如果您经常更新 db(您的域模型已更改),您可以使用 ddl/dml 工具,例如 liquibaseflywaydb。您在 xml 文件中描述 db 更改,并执行工具,所有更改将自动应用(自动控制之前已经修改的内容以及现在应该修改的内容)。

    只是推荐: 如果您不想猜测为什么会在生产中丢弃某些东西,最好使用 ddl 工具。 hibernate.ddl-auto 主要用于开发,不用于生产。在生产中,您可以使用 none 或 validate - 因为它们是安全的。

    【讨论】:

    • TLDR 将此键更改为此值。 spring.jpa.hibernate.ddl-auto=create-drop
    猜你喜欢
    • 2020-07-04
    • 2020-03-17
    • 2019-08-14
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多