springdata jpa之ddl-auto配置的属性

Posted qingmuchuanqi48

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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值,也不能识别对表结构的所有更改,往往只能识别出增加的字段,比如修改字段名,修改字段类型或者删除一个字段都是不能够识别的。

以上是关于springdata jpa之ddl-auto配置的属性的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot Jpa配置

spring.jpa.hibernate.ddl-auto=validate 是不是会更改数据库模式?

SpringData JPA之方法名查询的关键字表

spring.jpa.hibernate.ddl-auto=validate 或更新返回 beans.factory.BeanCreationException

jpa+springdata

spring.jpa.hibernate.ddl-auto 属性在 Spring 中是如何工作的?