Hibernate 的 MariaDB 方言类名称是啥?

Posted

技术标签:

【中文标题】Hibernate 的 MariaDB 方言类名称是啥?【英文标题】:What is the MariaDB dialect class name for Hibernate?Hibernate 的 MariaDB 方言类名称是什么? 【发布时间】:2016-09-01 03:38:50 【问题描述】:

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 的方言类名是什么?

【问题讨论】:

【参考方案1】:

非常简短的回答

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

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

简答

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

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

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

请注意,对于详细的使用信息,您有时需要查看方言源代码。 (部分方言源中存在非JavaDoc使用信息cmets。)

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

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

长答案

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

MariaDB:支持 MariaDB 数据库。可能适用于较新的版本

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

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

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

每个方言继承者都继承了以前方言版本的设置。所以 MariaDB 的继承层次是:MariaDB103Dialect &gt; MariaDB102Dialect &gt; MariaDB10Dialect &gt; MariaDB53Dialect &gt; MariaDBDialect &gt; MySQL5Dialect &gt; MySQLDialect &gt; 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-specific 从现在开始使用方言,因为它更容易匹配 MariaDB 具有相应 Hibernate 方言的版本。

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

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

例如,对于 Hibernate 用户来说,计算它不是很直观 出他们需要使用 MySQLInnoDb57Dialect 来处理 具有微秒精度的时间戳,从那时起就可用 MariaDB 5.3:

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

以前,要选择 MySQL 存储引擎,例如 MyISAM 或 InnoDB 或默认值,您可以在 MySQL57InnoDBDialectMySQL57Dialect 之间切换。但他们重构了从 Hibernate 5.2.8 开始的 MySQL 方言层次结构,如 Hibernate blog post 中所述。请注意,要选择存储引擎,您应该使用环境变量或系统属性: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(不支持小数秒),那么您可能需要将参数 useFractionalSeconds=false 提供给 JDBC URL,否则 MariaDB Connector/J 将不会截断内部时间戳,这可能会导致时间比较问题,这可能会导致 Hibernate 版本控制问题和时间类型的乐观锁定问题。

【讨论】:

很好的答案!但是尝试修复它的标题 ;-) 感谢您的回答。 NHibernate 也一样吗?【参考方案2】:

作为announced here,从 Hibernate ORM 5.2.8(2017 年 2 月 15 日左右)开始,方言

org.hibernate.dialect.MariaDB53Dialect

org.hibernate.dialect.MariaDBDialect

可用。公告的结论是

如果您使用 MariaDB,最好使用 MariaDB-specific 从现在开始使用方言,因为它更容易匹配 MariaDB 具有相应 Hibernate 方言的版本。

【讨论】:

【参考方案3】:

来自here,有人提到 "它需要是 MySQL5InnoDBDialect 或 MySQL57InnoDBDialect 而不是 MySQLInnoDBDialect"

完整列表见 http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#database-dialect

在 5.2.17 中添加了新的 MariaDB 方言。见JIRA和commit

【讨论】:

请注意,此答案已过时且不再正确。【参考方案4】:

您应该使用 Mysql5Dialect,因为 MariaDB 与 mysql 兼容。

https://mariadb.com/kb/en/mariadb-vs-mysql-compatibility/#incompatibilities-between-mariadb-55-and-mysql-55

【讨论】:

这不是真的! MariaDB 显然不兼容mysql。 @FrancisNiu 如您所见,答案是从 2016 年开始,今年 dbms 是兼容的。

以上是关于Hibernate 的 MariaDB 方言类名称是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Dialect 和 XAMPP 的问题(MySQL-MariaDB)

Microsoft SQL Server 2014 的 Hibernate 方言是啥?

hibernate中数据库方言

Hibernate 连接不同数据库的方言

hibernate设置各种数据库方言

Hibernate 3.6动态方言解析器