Hibernate 的 MariaDB 方言类名称是什么?

新手上路,请多包涵

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

在 Hibernate 中,MySQL5 方言的名字是

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

对于 Oracle 10g

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

MariaDB 的方言类名是什么?

原文由 Bijaya Bhaskar Swain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

正如 此处宣布的 那样,从 Hibernate ORM 5.2.8(2017 年 2 月 15 日左右)开始,方言

org.hibernate.dialect.MariaDB53Dialect

org.hibernate.dialect.MariaDBDialect

可用。公告的结论是

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

原文由 AntiTiming 发布,翻译遵循 CC BY-SA 3.0 许可协议

非常简短的回答

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

  • org.hibernate.方言。 MariaDB102MariaDB 服务器 10.2 方言
  • org.hibernate.方言。 MariaDB103Dialect 适用于 MariaDB 服务器 10.3 及更高版本,提供序列支持。
  • org.hibernate.方言。用于 MariaDB 服务器 10.0 和 10.1MariaDB10Dialect
  • org.hibernate.方言。 MariaDB53Dialect 用于 MariaDB 服务器 5.3 和更高的 5.x 版本
  • org.hibernate.方言。 MariaDB 服务器 5.1 和 5.2MariaDBDialect

简答

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

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

  • org.hibernate.dialect.MariaDB102MariaDB 服务器 10.2 的方言
  • org.hibernate.dialect.MariaDB103Dialect 用于 MariaDB 服务器 10.3 及更高版本,提供序列支持。
  • org.hibernate.dialect.MariaDB10MariaDB 服务器 10.0 和 10.1 的方言
  • org.hibernate.dialect.MariaDB53Dialect 用于 MariaDB 服务器 5.3 和更高版本的 5.x 版本。
  • org.hibernate.dialect.MariaDBDialect 用于 MariaDB 服务器 5.1 和 5.2。

请注意,对于详细的使用信息,您有时必须查看方言源代码。 (在某些方言来源中有非 JavaDoc 使用信息注释。)

如果要更改或明确提及 MariaDB 方言的存储引擎,可以使用 storage_engine Hibernate 变量。例如: hibernate.dialect.storage_engine = innodb 。 IMO,你应该明确地这样做,因为当切换到不同的 MariaDB 服务器版本时,默认值可能会改变。

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

长答案

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

  • MariaDB:支持 MariadB 数据库。可以使用较新的版本

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

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

  • org.hibernate.dialect.MariaDB102MariaDB 服务器 10.2 的方言
  • org.hibernate.dialect.MariaDB103Dialect 用于 MariaDB 服务器 10.3 及更高版本,提供序列支持。
  • org.hibernate.dialect.MariaDB10MariaDB 服务器 10.0 和 10.1 的方言
  • org.hibernate.dialect.MariaDB53Dialect 用于 MariaDB 服务器 5.3 和更高版本的 5.x 版本。
  • org.hibernate.dialect.MariaDBDialect 用于 MariaDB 服务器 5.1 和 5.2。

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

MariaDB 被设计为 MySQL 的直接替代品。但随着时间的推移,数据库可能会出现分歧。大多数基本功能可能都没有问题,允许您交换 Connector/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 以来可用的微秒级精度的时间戳并不是很直观:

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

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

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

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

原文由 Devabc 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题