Hibernate的MariaDB方言类名是什么?非常简短的答案简短的回答长答案

2022-09-01 11:14:19

Hibenate中,我正在使用MariaDB,但我找不到MariaDB的方言类名称。

在Hibernate中,MySQL5方言的名称是

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

对于甲骨文 10g

<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

MariaDB的方言类名是什么?


答案 1

非常简短的答案

在撰写本文时,目前的方言是:

  • org.hibernate.dialect.MariaDB102Dialect for MariaDB server 10.2
  • org.hibernate.dialect.MariaDB103Dialect for MariaDB server 10.3 及更高版本提供序列支持。
  • org.hibernate.dialect.MariaDB10Dialect for MariaDB server 10.0 and 10.1
  • org.hibernate.dialect.MariaDB53Dialect for MariaDB server 5.3,以及更高版本的 5.x 版本。
  • org.hibernate.dialect.MariaDBDialect for MariaDB server 5.1 and 5.2.

简短的回答

使用MariaDB服务器时,您应该使用MariaDB Connector/J和MariaDB Hibernate方言,而不是MySQL方言。尽管MariaDB是作为直接替代品创建的,即使基本功能在使用这些MySQL版本时可能会起作用,也可能会出现微妙的问题,或者您可能会错过某些功能。

目前,Hibernate 用户指南中未提及可用 MariaDB 方言的完整列表,但在 Hibernate JavaDoc 中未提及。根据您的 MariaDB 服务器版本,您应该选择相应的方言版本。在撰写本文时,目前的方言是:

  • org.hibernate.dialect.MariaDB102Dialect for MariaDB server 10.2
  • org.hibernate.dialect.MariaDB103Dialect for MariaDB server 10.3 及更高版本提供序列支持。
  • org.hibernate.dialect.MariaDB10Dialect for MariaDB server 10.0 and 10.1
  • org.hibernate.dialect.MariaDB53Dialect for MariaDB server 5.3,以及更高版本的 5.x 版本。
  • org.hibernate.dialect.MariaDBDialect for MariaDB server 5.1 and 5.2.

请注意,有关详细的用法信息,有时必须查看方言源代码。(在某些方言源中存在非 JavaDoc 使用信息注释。

如果要更改或明确提及 MariaDB 方言的存储引擎,可以使用 Hibernate 变量。例如:。IMO,您应该显式执行此操作,因为在切换到其他 MariaDB 服务器版本时,默认值可能会更改。storage_enginehibernate.dialect.storage_engine = innodb

如果您使用的是早于 10.1.2 的 MariaDB 服务器(不支持秒的小数部分),则可能需要向 JDBC URL 提供该参数,否则 MariaDB Connector/J 不会在内部截断时间戳,当这些值在比较查询中使用时(即使使用普通 JDBC 时),这可能会导致时间比较问题,这可能会导致休眠版本控制问题和时间类型的乐观锁定问题。useFractionalSeconds=false

长答案

Hibernate的MariaDB方言(截至撰写本文时为5.3)在Hibernate用户指南中提到。所提到的方言“简称”后跟备注是:

  • MariaDB:支持 MariadB 数据库。可与较新版本配合使用

  • MariaDB53:支持 MariadB 数据库,版本 5.3 及更高版本。

但是,可以在Hibernate JavaDoc中找到可用官方MariaDB方言的完整列表。当前列出:

  • org.hibernate.dialect.MariaDB102Dialect for MariaDB server 10.2
  • org.hibernate.dialect.MariaDB103Dialect for MariaDB server 10.3 及更高版本提供序列支持。
  • org.hibernate.dialect.MariaDB10Dialect for MariaDB server 10.0 and 10.1
  • org.hibernate.dialect.MariaDB53Dialect for MariaDB server 5.3,以及更高版本的 5.x 版本。
  • org.hibernate.dialect.MariaDBDialect for MariaDB server 5.1 and 5.2.

每个方言的后续版本都继承了以前方言版本的设置。因此,MariaDB的继承层次结构是:MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect

MariaDB被设计为MySQL的直接替代品。但随着时间的推移,数据库可能会分化。大多数基本功能可能没有问题,允许您交换连接器/ J客户端(MySQL服务器上的MariaDB客户端,反之亦然),并允许您交换方言(MariaDB客户端上的MySQL方言,反之亦然)。但是,存在一些细微的差异,可能会导致意想不到的问题。例如,MySQL Connector/J 客户端包含对服务器版本的硬编码检查,在使用 MariaDB 服务器时将失败,从而导致客户端中的某些功能被禁用,例如 MySQL sendFractionalSeconds 客户端参数。这将导致秒数被禁用,因此分数将在MySQL客户端中被截断,但在MariaDB客户端中不会被截断。(当将版本控制与日期/时间类型结合使用时,这甚至可能导致乐观锁定问题,并结合使用非最大精度的 SQL 日期/时间类型。在这些情况下,请使用最大精度 6。

此外,MariaDB方言有望为MariaDB提供特定功能:http://in.relation.to/2017/02/16/mariadb-dialects/

随着时间的推移,我们将根据MariaDB引入的新功能添加新的方言。

...

如果您使用的是MariaDB,最好从现在开始使用MariaDB特定的方言,因为将MariaDB版本与其适当的Hibernate方言相匹配要容易得多。

https://hibernate.atlassian.net/browse/HHH-11457 说:

由于MySQL和MariaDB已经朝着不同的方向发展,我们可能也想提供MariaDB方言。

例如,对于Hibernate用户来说,弄清楚他们需要使用MySQLInnoDb57Dialect来处理自MariaDB 5.3以来可用的微秒精度时间戳并不是很直观:

休眠用户指南未提供有关如何使用方言的所有使用信息。即使用户指南与API文档相结合也可能不够。有时,您必须在源代码中查找使用信息。例如,MariaDB53Dialect.java包含可能有用的隐藏的非 JavaDoc 注释。

以前,要选择MySQL存储引擎,例如MyISAM或InnoDB或默认值,您可以在例如和之间切换。但是他们从Hibernate 5.2.8开始重构了MySQL方言层次结构,如Hibernate博客文章中所述。请注意,要选择存储引擎,应使用环境变量或系统属性:。例如:。MySQL57InnoDBDialectMySQL57Dialecthibernate.dialect.storage_enginehibernate.dialect.storage_engine = innodb

XtraDB是MariaDB 10.1及更早版本的默认MariaDB存储引擎,但从10.2开始,它是InnoDB。因此,在某些情况下,您可能希望显式提及Hibernate选择的存储引擎,因此您必须使用该变量。有关该变量的信息(在用户指南中未提及)可以在 AvailableSettings.java 的源代码中找到。storage_enginestorage_engine

如果您使用的是早于 10.1.2 的 MariaDB 服务器(不支持秒的小数部分),则可能需要向 JDBC URL 提供该参数,否则 MariaDB Connector/J 不会在内部截断时间戳,这可能会导致时间比较问题,这可能会导致休眠版本控制问题和时态类型的乐观锁定问题。useFractionalSeconds=false


答案 2

正如这里所宣布的,从Hibernate ORM 5.2.8(大约2017年2月15日)开始,方言

org.hibernate.dialect.MariaDB53Dialect

org.hibernate.dialect.MariaDBDialect

可用。该公告的结论是:

如果您使用的是MariaDB,最好从现在开始使用MariaDB特定的方言,因为将MariaDB版本与其适当的Hibernate方言相匹配要容易得多。


推荐