hibernate Spring Boot JPA:实体更改时删除列

vsaztqbk  于 2023-02-09  发布在  Spring
关注(0)|答案(1)|浏览(255)

我正在尝试使用spring-boot-starter-data-jpa从java类创建MySQL数据库中的表。除了在java类中更改/删除列名外,它工作得很好。下面是一个例子:
我有一个名为“Staff”的类,包含2个字段:ID、名称

@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

当我运行我的项目时,一个“Staff”表完全按照我的要求生成,包含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

“Staff”表现在包含4列(id,name,firstname,lastname)而不是3列。然后我需要自己删除“name”列。有什么办法可以自动删除它吗?

nzk0hqpo

nzk0hqpo1#

看起来您使用了:

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

78.1使用JPA初始化数据库
spring. jpa. generate-ddl(boolean)用于打开和关闭特性,并且独立于供应商。spring. jpa. hib. ddl-auto(enum)是一个Hibernate特性,它以更细粒度的方式控制行为。
您可以显式地设置spring.jpa.hibernate.ddl-auto,标准的Hibernate属性值为none、validate、update、create、create-drop。
正如你所看到的,没有什么新的东西(与hib不同)
ddl-auto = update-generate changesbut它不会删除未Map的列。例如,您可以有一个包含10列的表,并且只为其中3列Map,在这种情况下,自动模式可能会删除它们,但对于hib/jpa,完整Map表实体不是强制性的。以下是2011年11月创建的jira ticket Alter and drop columns with hbm2ddl.auto=update,现在状态为"未修复"。
如果你经常更新数据库(你的域模型改变了),你可以使用ddl/dml工具,比如liquibaseflywaydb。你在xml文件中描述数据库的变化,并执行工具,所有的变化将被自动应用(自动控制以前已经修改了什么,现在应该修改什么)。
仅推荐:如果你不想猜测为什么某些东西在生产中被丢弃,最好使用ddl工具。hib. dld-auto主要用于开发,而不是生产。在生产中,你可以使用none或validate-因为它们是安全的。

相关问题