springdata jpa之ddl-auto配置的属性
在jpa中ddl-auto一共有四种:
分别为:
ddl-auto:create ----每次运行该程序,没有表格会新建表格,表内有数据会清空;
ddl-auto:create-drop ----每次程序结束的时候会清空表
ddl-auto:update ---- 每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
ddl-auto: validate ---- 运行程序会校验数据与数据库的字段类型是否相同,不同会报错。
上图为properties配置文件的配置项:
使用1)spring.jpa.hibernate.ddl-auto=create
运行的sql为:
Hibernate: drop table if exists auth_user Hibernate: create table auth_user (id bigint not null, account varchar(32), name varchar(32), pwd varchar(64), primary key (id)) engine=InnoDB Hibernate删掉已经存在表, 并重建表,恐怖!!!
使用2)spring.jpa.hibernate.ddl-auto=create-drop
运行的sql为:
Hibernate: drop table if exists auth_user Hibernate: drop table if exists cardo Hibernate: create table auth_user (id bigint not null, account varchar(32), name varchar(32), pwd varchar(64), primary key (id)) engine=InnoDB Hibernate: create table cardo (id bigint not null, brand_id integer, brand_name varchar(16), primary key (id)) engine=InnoDB ... Hibernate: drop table if exists auth_user Hibernate: drop table if exists cardo
使用3)spring.jpa.hibernate.ddl-auto=update
运行的sql为:
Hibernate: create table auth_user (id bigint not null, account varchar(32), name varchar(32), pwd varchar(64), primary key (id)) engine=InnoDB Hibernate: create table cardo (id bigint not null, brand_id integer, brand_name varchar(16), primary key (id)) engine=InnoDB
给entity类添加一个字段others, 表也会自动同步添加一个字段others.
@Entity @Table(name = "AUTH_USER") @Data @Builder @AllArgsConstructor @NoArgsConstructor public class UserDO { @Id private Long id; @Column(length = 32) private String name; @Column(length = 32) private String account; @Column(length = 64) private String pwd; @Column(length = 255) private String others; }
添加个字段others
执行的sql为:
Hibernate: alter table auth_user add column others varchar(255)
给表添加了字段others.
表添加一个字段, 对entity类有啥影响?
没有任何影响.
Hibernate: insert into auth_user (account, name, others, pwd, id) values (?, ?, ?, ?, ?)
不会校验entity中字段类型和表中对应的字段的类型是否匹配。
使用4)spring.jpa.hibernate.ddl-auto=validate
当表中字段others是varchar类型, 实体类entity的others是Integer类型,
类型不匹配报错:
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [others] in table [auth_user]; found [varchar (Types#VARCHAR)], but expecting [integer (Types#INTEGER)]
使用5)spring.jpa.hibernate.ddl-auto=none
禁止ddl
由于ddl-auto不能同时指定多个属性, 只能在create, create-drop, update, validate, none中选择一个属性
总结:
一般选择validate/update/none
绝对不能选 create, create-drop
update能帮助建表。
如果希望实体类发生改动而数据库表做出相应的更改且不破坏数据库现有的数据,要将spring.jpa.hibernate.ddl-auto属性值设置为update
这里还有一点,就算把ddl-auto设置成update值,也不能识别对表结构的所有更改,往往只能识别出增加的字段,比如修改字段名,修改字段类型或者删除一个字段都是不能够识别的。
本文来自博客园,作者:King-DA,转载请注明原文链接:https://www.cnblogs.com/qingmuchuanqi48/p/11616145.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 用 C# 插值字符串处理器写一个 sscanf
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!