jpa下hibernate的ddl-auto的各种属性

55 篇文章 2 订阅
14 篇文章 0 订阅

在jpa中ddl-auto一共有四种,分别为:

ddl-auto:create ----每次运行该程序,没有表格会新建表格,表内有数据会清空;
ddl-auto:create-drop ----每次程序结束的时候会清空表
ddl-auto:update ---- 每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
ddl-auto: validate ---- 运行程序会校验数据与数据库的字段类型是否相同,不同会报错。

img

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删掉已经存在表, 并重建表,恐怖!!!

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

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中字段类型和表中对应的字段的类型是否匹配。

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)]

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值,也不能识别对表结构的所有更改,往往只能识别出增加的字段,比如修改字段名,修改字段类型或者删除一个字段都是不能够识别的。

spring.jpa.show-sql=true

此配置指定是否在控制台中显示执行的SQL语句。如果设置为true,那么每次Hibernate执行SQL时,这些SQL语句都会在应用的控制台或日志文件中显示出来。这对于开发和调试非常有用,因为它可以帮助开发者了解底层数据库操作和潜在的性能问题。然而,在生产环境中,通常建议将其关闭,以避免日志文件过大及潜在的性能影响。


spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

Hibernate方言(Dialect)是Hibernate用来与数据库进行交互的配置,它告诉Hibernate应该使用哪种SQL变体。不同的数据库(如MySQL、Oracle、PostgreSQL等)支持的SQL语法和功能可能会有差异,方言配置确保Hibernate能够生成最优化且兼容特定数据库的SQL语句。

  • org.hibernate.dialect.MySQL5Dialect:这是针对MySQL数据库版本5的方言。如果你的数据库是MySQL 5.x版本,应该使用这个方言以确保所有的Hibernate生成的SQL语句都与MySQL 5.x兼容。

这些配置是Spring Data JPA和Hibernate整合时常用的基础配置,可以根据具体情况进行调整以适应不同的开发和生产需求。

如果我使用的是oracle应该用哪个dialect?

如果您的应用使用Oracle数据库,您需要配置Hibernate以使用适合Oracle的方言。Hibernate方言是专门为不同数据库设计的配置,确保Hibernate可以生成与特定数据库兼容的SQL语句。对于Oracle数据库,Hibernate提供了几种方言类,适用于不同版本的Oracle数据库。

Oracle方言选项

  • Oracle 8i:

    • org.hibernate.dialect.Oracle8iDialect
    • 适用于Oracle 8i版本的数据库。
  • Oracle 9i:

    • org.hibernate.dialect.Oracle9iDialect
    • 适用于Oracle 9i版本的数据库。
  • Oracle 10g:

    • org.hibernate.dialect.Oracle10gDialect
    • 适用于Oracle 10g版本的数据库。这个方言也适用于后续版本,包括11g和12c,因为Oracle数据库在这些版本之间在SQL层面的变化不大。
  • Oracle 12c:

    • org.hibernate.dialect.Oracle12cDialect
    • 这是专门为Oracle 12c及更高版本设计的方言,支持一些新特性,如身份列(identity column)。

选择正确的方言

选择方言时,重要的是要根据您使用的Oracle数据库的具体版本来选择。如果您使用的是Oracle 12c或更高版本,建议使用Oracle12cDialect,因为它提供了对新特性的支持。对于10g或11g,Oracle10gDialect通常是一个很好的选择。

配置示例

在Spring Boot的application.propertiesapplication.yml中配置Oracle方言的示例:

application.yml
spring:
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.Oracle12cDialect

确保也配置了其他必要的Oracle数据库连接设置,如数据源URL、用户名和密码。

注意事项

  • 驱动依赖:确保项目中包含了适合您的Oracle数据库版本的JDBC驱动。
  • 性能调优:方言不仅影响SQL的兼容性,还可能影响性能。在生产环境部署前,务必进行充分的测试,以确保应用的性能符合预期。
  • 版本兼容性:随着Oracle数据库新版本的发布,可能需要更新Hibernate或方言设置以利用新特性或优化

如果使用了不恰当的Dialect,会有什么影响?

使用不恰当的 Hibernate 方言(Dialect)对于一个基于 Hibernate 的应用来说可能会带来多种影响,主要包括:

1. SQL 错误

当方言不匹配时,Hibernate 可能生成不兼容当前数据库版本或类型的 SQL 语句。例如,某些 SQL 函数或语法结构在某个特定数据库版本中可能不被支持,或者其行为与其他版本不同。这种情况下,应用可能会遇到运行时错误,如 SQL 语法错误或执行命令失败。

2. 性能问题

不正确的方言可能导致 Hibernate 生成的 SQL 语句不是针对特定数据库优化的,这可能会影响查询效率和执行速度。例如,使用通用的 SQL 而非针对特定数据库优化的查询,可能会导致较慢的查询反应时间和较高的处理负载。

3. 功能不完整

某些数据库特有的功能(如特定类型的索引、分区策略或高级查询功能)可能在错误的方言配置下无法利用。这可能会限制应用程序使用数据库的全部能力,从而影响其功能和性能。

4. 数据一致性问题

错误的方言可能导致数据类型映射错误,例如日期和时间类型可能因为方言不匹配而错误处理。这可能导致数据存储错误,如日期时间值的错误解释,可能进一步影响应用逻辑和数据一致性。

5. 数据库特定优化的缺失

每种数据库都有其独特的优化和特性,正确的方言能够帮助 Hibernate 利用这些特性来提高性能和兼容性。使用不当的方言意味着这些优化不能被充分利用。

如果不指定这个Dialect会怎么样?

如果在使用Hibernate时不指定数据库方言(Dialect),Hibernate将尝试自动检测连接的数据库类型,并使用一个通用的或默认的方言。然而,这种自动检测可能不总是准确的,或者可能不是最优的选择,尤其是在使用较新的数据库版本或特殊配置时。不指定方言可能会带来以下几个潜在问题:

1. 自动检测失败

在一些情况下,如果Hibernate不能正确识别数据库,它可能无法自动选择任何方言,这会导致应用启动失败或运行时错误,因为没有适当的方言来生成有效的SQL语句。

2. 性能不佳

即使Hibernate成功自动选择了一个方言,该方言可能不是针对您的特定数据库版本或配置优化的。这可能导致性能不佳,因为生成的SQL语句可能不是最优的,或者没有利用数据库的高级功能和优化。

3. 功能限制

不同的数据库支持不同的SQL特性和数据类型。如果使用的方言不精确匹配数据库,一些特定于数据库的高级功能(如特殊的索引类型、存储过程、高级查询优化等)可能无法使用。

4. 错误的数据处理

错误的或不完全匹配的方言可能导致数据类型处理错误。例如,日期和时间类型的处理在不同数据库中可能有所不同,如果方言没有正确处理这些差异,可能会导致数据格式错误、数据丢失或其他数据一致性问题。

5. 维护和扩展问题

在未来扩展或维护应用时,如果原始的方言选择不明确,可能会增加额外的复杂性。新的开发人员或数据库管理员可能需要更多时间来理解应用的数据库交互方式,特别是在迁移或升级数据库时。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micrle_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值