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

news2025/1/21 12:10:36

在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. 维护和扩展问题

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024最新IDEA插件开发+发布全流程 SelectCamelWords[选中驼峰单词](idea源代码)

2024最新IDEA插件开发(发布)-SelectCamelWords[选中驼峰单词](idea源代码) 参考文档 Jetbrains Idea插件开发文档: https://plugins.jetbrains.com/docs/intellij/welcome.html代码地址:https://github.com/yangfeng…

如何覆盖!important修饰的属性

最简单的方法 如果这个!important修饰的属性 是自己的写的,去掉这种写法,使用优先级的方式来写这个属性(.outter .inner 的优先级就会比 。outter的优先级高) 复杂的方法:用魔法打败魔法 但是这个样式来自于全局css&am…

代码随想录——子集Ⅱ(Leecode 90)

题目链接 回溯 class Solution {List<List<Integer>> res new ArrayList<List<Integer>>();List<Integer> list new ArrayList<Integer>();boolean[] used; public List<List<Integer>> subsetsWithDup(int[] nums) {use…

Maven 插件列表详解

Maven 是一个强大的项目管理和构建工具&#xff0c;广泛应用于 Java 项目中。作为一款优秀的构建管理工具&#xff0c;Maven 不仅提供了标准化的项目结构和依赖管理&#xff0c;还通过其丰富的插件系统&#xff0c;极大地扩展了其功能和灵活性。无论是代码编译、测试、打包&…

第55期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

怎样搭建serveru ftp个人服务器

首先说说什么是ftp&#xff1f; FTP协议是专门针对在两个系统之间传输大的文件这种应用开发出来的&#xff0c;它是TCP/IP协议的一部分。FTP的意思就是文件传输协议&#xff0c;用来管理TCP/IP网络上大型文件的快速传输。FTP早也是在Unix上开发出来的&#xff0c;并且很长一段…

【linux】内核从tcp层调用IP层摸索中

合入代码&#xff1a; 登录 - Gitee.com 这是运行日志&#xff1a; https://gitee.com/r77683962/linux-6.9.0/raw/master/test_log/kern_tcp_ip.log 日志截取部分&#xff08;也不知道对不对&#xff0c;凭感觉走。。。。&#xff09;

「51媒体」电视台媒体邀约采访报道怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 电视台作为地方主流媒体&#xff0c;对于新闻报道有着严格的选题标准和报道流程。如果您希望电视台对某个会议或活动进行报道&#xff0c;可以按这样的方法来做&#xff1a; 1.明确活动信…

BizDevOps全局建设思路:横向串联,纵向深化

本文来自腾讯蓝鲸智云社区用户&#xff1a;CanWay BizDevOps概述 IT技术交付实践方法在不断迭代中持续优化。在工业化时代&#xff0c;Biz&#xff08;业务&#xff09;、Dev&#xff08;开发&#xff09;、Ops&#xff08;运维&#xff09;三者往往相对分离&#xff0c;甚至有…

Python3 Matplotlib展示数据

matplotlib 是一个 Python 库&#xff0c;用于创建各种类型的图表和可视化。它提供了一个类似于 MATLAB 的绘图界面&#xff0c;使用户能够轻松地绘制线图、散点图、直方图、饼图等各种图表类型。matplotlib 可以在 Python 脚本、IPython shell、Jupyter Notebook 等环境中使用…

《梦醒蝶飞:释放Excel函数与公式的力量》3.3常用数学函数:AVERAGE

3.3常用数学函数&#xff1a;AVERAGE 在Excel中&#xff0c;AVERAGE 函数用于计算一系列数值的平均值。这个函数在数据分析中非常有用&#xff0c;因为它可以快速提供数值集的中心趋势。 1)基本语法&#xff1a; AVERAGE(range) 或者 AVERAGE(number1,[number2,...]) ran…

Jetpack Compose_Alignment对其+Arrangement排列

文章目录 1.Alignment 对齐1.1Alignment 对齐方式1.2AbsoluteAlignment 绝对对齐1.3BiasAlignment 偏差对齐1.4BiasAbsoluteAlignment偏差绝对对齐 2.Arrangement 排列2.1Arrangement 排列方式2.2Arrangement.Horizontal2.3Arrangement.Vertical 1.Alignment 对齐 1.1Alignmen…

Linux之旅: 基础知识点的终极指南

文章目录 1、Linux的目录结构2、ls命令3、管理文件和目录4、linux命令使用细节和技巧5、权限管理基本命令6、搜索命令7、管道符与重定向8、压缩和解压命令9、用户及vim编辑器10、用户和用户组管理一、Linux系统用户账号的基本管理二、Linux系统用户组的管理 1、Linux的目录结构…

大数据集群离线解析经纬度逆编码地址

背景 最近有个需要需求把经纬度解析为地址&#xff0c;那么通常解析地址市面上流行的方案就是调取百度、高德地图的接口进行解析。 难点 但是在用这个方案遇到一个问题就是企业认证的百度地图每天的逆编码解析为300w次&#xff0c;qps为100次/秒&#xff0c;对于日增上千万的…

2025年计算机毕业设计题目参考-简单容易

2025年最新计算机毕业设计题目参考-第二批 以下可以参考 企业员工薪酬关系系统的设计 基于SpringBoot在线远程考试系统 SpringBootVue的乡政府管理系统 springboot青年公寓服务平台 springboot大学生就业需求分析系统 基于Spring Boot的疗养院管理系统 基于SpringBoot的房屋交…

MySQL全解(基础)-(MySQL的安装与配置,数据库基础操作(CRUD,聚合,约束,联合查询),索引,事务)

MySQL安装与配置 1.数据库介绍 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便数据库存储介质&#xff1a; 磁盘 内存 为了…

从ITIL,CMMI到DevOps的实践与思考

点击进入IT管理资料库 在信息技术迅猛发展的今天&#xff0c;企业对IT运维和管理的要求越来越高。从最早的ITIL&#xff0c;到后来的CMMI&#xff0c;再到现在风靡全球的DevOps&#xff0c;每一个管理框架的出现都代表着一种新的思维和实践模式。ITIL帮助企业建立起系统的IT服…

微信小程序生命周期分为3种:页面级别,应用级别,组件级别

应用级别&#xff1a; onLaunch&#xff0c;onShow&#xff0c;onHide 页面级别&#xff1a;onLoad&#xff0c;onShow&#xff0c;onReady&#xff0c;onHide&#xff0c;onUnload 组件级别&#xff1a;

Webmin介绍与安装

文章目录 前言定义与功能&#xff1a;支持的操作系统&#xff1a;功能特性&#xff1a;插件与模块&#xff1a;使用场景&#xff1a;特点&#xff1a;安装与配置&#xff1a;总结 前言 Webmin是一款功能强大的基于Web的Unix系统管理工具 定义与功能&#xff1a; Webmin允许管…

HTTP性能测试工具-wrk

wrk性能测试工具详解 wrk是一款轻量级但功能强大的HTTP基准测试工具&#xff0c;主要用于在单机多核CPU环境下对HTTP服务进行性能测试。它通过利用系统自带的高性能I/O机制&#xff08;如epoll、kqueue等&#xff09;&#xff0c;结合多线程和事件模式&#xff0c;能够产生大量…