5.1 自动数据模式生成

当您第一次配置 Hibernate 时,您可以启用许多有趣的设置。之前没带,免得喷了。但在关卡结束时,我想到了其中的一些内容。

第一个这样的设置是hbm2ddl.auto. 它可以有 5 个不同的值:

证实 验证:Hibernate 将检查列名和字段名以及类型在数据库和注释中是否匹配。这是最常见的模式。
更新 更新:如果表或它们的列与预期不同,Hibernate 将更新数据库中的表。
创造 重新创建:Hibernate 将删除数据库中的所有表,并根据注释中的数据重新创建它们。
创建下降 创建删除。在工作开始时,Hibernate 将创建所有表,在工作结束时,它会自行删除它们。
没有任何 Hibernate 根本不会做任何事情。如果某个地方的基础与预期不匹配,那么在执行查询期间将抛出错误。

5.2 记录请求

Hibernate 的第二个非常有用的设置是记录它对数据库的所有请求:所有对数据库的请求都在控制台中复制。如果您正在更改与 Hibernate 相关的代码,这是一个非常有用的功能。

首先,您将更好地了解您的查询是如何转换为 SQL 的。其次,您可以更轻松、更早地发现错误。他们肯定会的。Hibernate 并不总是按照我们期望的方式工作。这尤其经常与注释相关联:您以自己的方式理解它们,以您自己的方式理解 Hibernate。

启用日志记录的设置称为hibernate.show_sql。如果将其值设置为 true,则对数据库的查询将写入控制台。该参数也与它结合使用hibernate.format_sql,可以让你在日志中设置一个方便的SQL查询格式。

将请求记录到数据库的另一种方法是使用标准记录器。一切都表明 Hibernate 已经将其查询写入标准记录器,但仅限于范围 - DEBUG。您需要更改标准记录器中的两个属性:

logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace

将BasicBinder的级别更改为trace将向我们添加查询参数,但是,以一种稍微不寻常的形式 - 在查询本身之后的顺序枚举。

第三种方法是为数据库使用一个特殊的代理驱动程序

例如,log4jdbcp6spy。两个代理都在工作并且有启动器,尽管log4jdbc在撰写本文时很长时间没有提交。


<dependency>
    <groupId>com.integralblue</groupId>
    <artifactId>log4jdbc-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
</dependency>

我不会详细介绍,我只想让您知道这是可能的。

5.3 SQL 方言

以及更多背景信息。

Hibernate 支持大量的 DBMS。它们中的每一个都实现了一组标准的 SQL 函数和一些它们自己的函数。或者不同版本的 SQL。因此,要使用这些 DBMS,您需要告诉 Hibernate 使用 SQL 语言的哪种方言。

以下是最流行的方言列表:

数据库 org.hibernate.dialect.PostgreSQL方言
SAP数据库 org.hibernate.dialect.SAPDB方言
数据库 org.hibernate.dialect.SybaseDialect
英飞凌 org.hibernate.dialect.InformixDialect
微软 SQL Server 2008 org.hibernate.dialect.SQLServer2008方言
MySQL org.hibernate.dialect.MySQL方言
甲骨文(任何版本) org.hibernate.dialect.Oracle方言
甲骨文 11g org.hibernate.dialect.Oracle10g方言

当然,可以有任意数量的这样的方言。您可以为它编写自己的 DBMS 和自己的方言。

为什么指定正确的方言很重要?

每个数据库的数据类型可能略有不同。因此,为了让 Hibernate 完全按照您期望的方式完美地工作,您需要告诉它需要使用 SQL 语言的哪种方言。

这是一张有趣的图片,显示了现实中一切都是如何连接的:

5.4 常用设置

为了让您的生活更轻松,这里有几个设置的完整列表:

MySQL 8.0
hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
hibernate.connection.driver_class=com.mysql.cj.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/test
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=validate
MySQL 5.0
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/test
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=validate
数据库
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class= org.postgresql.Driver
hibernate.connection.url= jdbc:postgresql://localhost/test
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=validate

MySQL 8.0 比 MySQL 5.0 支持更多的特性,因此如果您希望 Hibernate 充分利用所有这些特性,请指定正确的方言。

H2 数据库通常存储在内存中,mem:testSQL 服务器的名称和您将使用的模式的名称也是如此。