Spring boot JPA:删除实体更改列

Lê *_*Bảo 3 java mysql spring hibernate spring-data-jpa

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

我有一个班级电话"工作人员",有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
Run Code Online (Sandbox Code Playgroud)

当我运行我的项目时,一个"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
Run Code Online (Sandbox Code Playgroud)

"Staff"表现在包含4列(id,name,firstname,lastname)而不是3.然后我需要自己删除"name"列.反正有没有自动摆脱它?

xyz*_*xyz 8

看起来你使用:

 spring.jpa.properties.hibernate.ddl-auto=update
Run Code Online (Sandbox Code Playgroud)

78.1使用JPA初始化数据库

spring.jpa.generate-ddl(boolean)打开和关闭该功能,与供应商无关.spring.jpa.hibernate.ddl-auto(enum)是一个Hibernate功能,它以更细粒度的方式控制行为.请参阅下文了解更多详情.

您可以显式设置spring.jpa.hibernate.ddl-auto,标准Hibernate属性值为none,validate,update,create,create-drop.

你可以看到没有什么新东西(与休眠不同)

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

如果经常更新db(您的域模型已更改),则可以使用liquibase,flywaydb等ddl/dml工具.您在xml文件和执行工具中描述数据库更改,所有更改都将自动应用(使用自动控制之前已修改的内容以及现在应修改的内容).

只是建议:如果你不想猜测为什么某些东西在生产中下垂,最好使用ddl工具.hibernate.ddl-auto maily用于开发,不用于生产.在生产中,您可以使用none或验证 - 因为它们是安全的.

  • TLDR将此键更改为此值.spring.jpa.hibernate.ddl-AUTO =创造降 (2认同)