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
将向我们添加查询参数,但是,以一种稍微不寻常的形式 - 在查询本身之后的顺序枚举。
第三种方法是为数据库使用一个特殊的代理驱动程序。
例如,log4jdbc
或p6spy
。两个代理都在工作并且有启动器,尽管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 |
---|
|
MySQL 5.0 |
---|
|
数据库 |
---|
|
MySQL 8.0 比 MySQL 5.0 支持更多的特性,因此如果您希望 Hibernate 充分利用所有这些特性,请指定正确的方言。
H2 数据库通常存储在内存中,mem:test
SQL 服务器的名称和您将使用的模式的名称也是如此。
GO TO FULL VERSION