Hibernate 的 MariaDB 方言 class 名称是什么?
What is the MariaDB dialect class name for Hibernate?
在 Hibenate 中,我正在使用 MariaDB 但我找不到 [=21= 的方言 class 名称]MariaDB .
在 Hibernate 中,MySQL5方言的名称是
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
对于 Oracle 10g
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
MariaDB 的方言 class 名称是什么?
你应该使用 Mysql5Dialect,因为 MariaDB 兼容 mysql。
来自here,有人提到
"it needs to be the MySQL5InnoDBDialect or MySQL57InnoDBDialect instead of the MySQLInnoDBDialect"
作为 announced here,从 Hibernate ORM 5.2.8(2017 年 2 月 15 日左右)开始,方言
org.hibernate.dialect.MariaDB53Dialect
和
org.hibernate.dialect.MariaDBDialect
可用。公告总结
If you are using MariaDB, it’s best to use the MariaDB-specific
Dialects from now on since it’s much easier to match the MariaDB
version with its appropriate Hibernate Dialect.
非常简短的回答
在撰写本文时,当前的方言是:
- 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.MariaDB 方言 用于 MariaDB 服务器 5.1 和 5.2.
简答
使用 MariaDB 服务器时,您应该使用 MariaDB Connector/J 和 MariaDB Hibernate 方言,而不是 MySQL 方言。尽管 MariaDB 是作为一个直接替代品而创建的,即使使用这些 MySQL 版本时基本功能可能会起作用,但可能会出现细微的问题,或者您可能会错过某些功能。
Hibernate 用户指南中目前未提及可用 MariaDB 方言的完整列表,但在 Hibernate JavaDoc 中。 根据您的 MariaDB 服务器版本,您应该 select 相应的方言版本 。在撰写本文时,当前的方言是:
- org.hibernate.dialect.MariaDB102MariaDB 服务器 10.2 的方言
- org.hibernate.dialect.MariaDB103MariaDB 服务器 10.3 及更高版本的方言,提供序列支持。
- org.hibernate.dialect.MariaDB10MariaDB 服务器 10.0 和 10.1 的方言
- org.hibernate.dialect.MariaDB53MariaDB 服务器 5.3 及更高 5.x 版本的方言。
- org.hibernate.dialect.MariaDB 服务器 5.1 和 5.2 的 MariaDBDialect。
请注意,有关详细的使用信息,您有时需要查看方言源代码。 (在某些方言来源中有非 JavaDoc 使用信息注释。)
如果要更改或明确提及 MariaDB 方言的存储引擎,可以使用 storage_engine
Hibernate 变量。例如:hibernate.dialect.storage_engine = innodb
。 IMO,你应该明确地这样做,因为当切换到不同的 MariaDB 服务器版本时,默认值可能会改变。
如果您使用的 MariaDB 服务器早于 10.1.2(不支持小数秒),那么您可能需要向 JDBC URL,否则 MariaDB Connector/J 不会在内部截断时间戳,这可能会在比较查询中使用这些值时导致时间比较问题(即使使用普通 JDBC),这可能会导致 Hibernate 版本控制问题和时间类型的乐观锁定问题。
长答案
Hibernate User Guide 中提到了用于 Hibernate 的 MariaDB 方言(撰写本文时为 5.3)。提到的方言"short names"后面的备注是:
MariaDB: Support for the MariadB database. May work with newer versions
MariaDB53: Support for the MariadB database, version 5.3 and newer.
但是,可以在 Hibernate JavaDoc 中找到可用的官方 MariaDB 方言的完整列表。目前列出:
- org.hibernate.dialect.MariaDB102MariaDB 服务器 10.2 的方言
- org.hibernate.dialect.MariaDB103MariaDB 服务器 10.3 及更高版本的方言,提供序列支持。
- org.hibernate.dialect.MariaDB10MariaDB 服务器 10.0 和 10.1 的方言
- org.hibernate.dialect.MariaDB53MariaDB 服务器 5.3 及更高 5.x 版本的方言。
- org.hibernate.dialect.MariaDB 服务器 5.1 和 5.2 的 MariaDBDialect。
每个方言后继者都继承了前一个方言版本的设置。所以 MariaDB 的继承层次结构是:MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect
MariaDB 被设计为 MySQL 的直接替代品。但随着时间的推移,数据库可能会出现分歧。大多数基本功能可能没有问题,允许您交换 Connector/J 客户端(MySQL 服务器上的 MariaDB 客户端,反之亦然),并允许您交换方言(MySQL MariaDB 客户端上的方言和反之亦然)。但是存在细微的差异,可能会导致意想不到的问题。例如,MySQL Connector/J 客户端包含对服务器版本的硬编码检查,在使用 MariaDB 服务器时会失败,导致客户端中的某些功能被禁用,例如 MySQL sendFractionalSeconds 客户端参数。这将导致小数秒被禁用,因此小数部分将在 MySQL 客户端中被截断,但不会在 MariaDB 客户端中被截断。 (当使用 date/time 类型和非最大精度 SQL date/time 类型的版本控制时,这甚至可能导致乐观锁定问题。在这些情况下,使用最大精度 6。)
此外,MariaDB 方言有望为 MariaDB 提供特定功能:
http://in.relation.to/2017/02/16/mariadb-dialects/
In time, we will add new Dialects based on newer capabilities
introduced by MariaDB.
...
If you are using MariaDB, it’s best to use the MariaDB-specific
Dialects from now on since it’s much easier to match the MariaDB
version with its appropriate Hibernate Dialect.
并且https://hibernate.atlassian.net/browse/HHH-11457说:
since MySQL and MariaDB have gone in different directions, we might
want to provide MariaDB Dialects as well.
For instance, it's not very intuitive for a Hibernate user to figure
out that they need to use the MySQLInnoDb57Dialect to handle
Timestamps with microsecond precision which have been available since
MariaDB 5.3:
Hibernate 用户指南并未提供有关如何使用方言的所有使用信息。即使用户指南与 API 文档相结合也可能不够。有时您必须查看源代码以获取使用信息。例如,MariaDB53Dialect.java 包含可能有用的隐藏的非 JavaDoc 注释。
以前,对于 select MySQL 存储引擎,例如 MyISAM 或 InnoDB 或默认,您可以在 MySQL57InnoDBDialect
和 MySQL57Dialect
之间切换。但他们重构了从 Hibernate 5.2.8 开始的 MySQL 方言层次结构,如 Hibernate blog post 中所述。请注意,对于 select 存储引擎,您应该使用环境变量或系统 属性: hibernate.dialect.storage_engine
。例如:hibernate.dialect.storage_engine = innodb
。
XtraDB 是 MariaDB 10.1 及更早版本的默认 MariaDB 存储引擎,但从 10.2 开始它是 InnoDB。所以可能有些情况下你想明确提到 Hibernate selects 的存储引擎,那么你将不得不使用 storage_engine
变量。有关 storage_engine
变量的信息(用户指南中未提及),可在 AvailableSettings.java
.
的源代码中找到
如果您使用的 MariaDB 服务器早于 10.1.2(不支持小数秒),那么您可能需要向 JDBC URL,否则 MariaDB Connector/J 不会在内部截断时间戳,这会导致时间比较问题,这会导致 Hibernate 版本控制问题和临时类型的乐观锁定问题。
在 Hibenate 中,我正在使用 MariaDB 但我找不到 [=21= 的方言 class 名称]MariaDB .
在 Hibernate 中,MySQL5方言的名称是
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
对于 Oracle 10g
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
MariaDB 的方言 class 名称是什么?
你应该使用 Mysql5Dialect,因为 MariaDB 兼容 mysql。
来自here,有人提到 "it needs to be the MySQL5InnoDBDialect or MySQL57InnoDBDialect instead of the MySQLInnoDBDialect"
作为 announced here,从 Hibernate ORM 5.2.8(2017 年 2 月 15 日左右)开始,方言
org.hibernate.dialect.MariaDB53Dialect
和
org.hibernate.dialect.MariaDBDialect
可用。公告总结
If you are using MariaDB, it’s best to use the MariaDB-specific Dialects from now on since it’s much easier to match the MariaDB version with its appropriate Hibernate Dialect.
非常简短的回答
在撰写本文时,当前的方言是:
- 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.MariaDB 方言 用于 MariaDB 服务器 5.1 和 5.2.
简答
使用 MariaDB 服务器时,您应该使用 MariaDB Connector/J 和 MariaDB Hibernate 方言,而不是 MySQL 方言。尽管 MariaDB 是作为一个直接替代品而创建的,即使使用这些 MySQL 版本时基本功能可能会起作用,但可能会出现细微的问题,或者您可能会错过某些功能。
Hibernate 用户指南中目前未提及可用 MariaDB 方言的完整列表,但在 Hibernate JavaDoc 中。 根据您的 MariaDB 服务器版本,您应该 select 相应的方言版本 。在撰写本文时,当前的方言是:
- org.hibernate.dialect.MariaDB102MariaDB 服务器 10.2 的方言
- org.hibernate.dialect.MariaDB103MariaDB 服务器 10.3 及更高版本的方言,提供序列支持。
- org.hibernate.dialect.MariaDB10MariaDB 服务器 10.0 和 10.1 的方言
- org.hibernate.dialect.MariaDB53MariaDB 服务器 5.3 及更高 5.x 版本的方言。
- org.hibernate.dialect.MariaDB 服务器 5.1 和 5.2 的 MariaDBDialect。
请注意,有关详细的使用信息,您有时需要查看方言源代码。 (在某些方言来源中有非 JavaDoc 使用信息注释。)
如果要更改或明确提及 MariaDB 方言的存储引擎,可以使用 storage_engine
Hibernate 变量。例如:hibernate.dialect.storage_engine = innodb
。 IMO,你应该明确地这样做,因为当切换到不同的 MariaDB 服务器版本时,默认值可能会改变。
如果您使用的 MariaDB 服务器早于 10.1.2(不支持小数秒),那么您可能需要向 JDBC URL,否则 MariaDB Connector/J 不会在内部截断时间戳,这可能会在比较查询中使用这些值时导致时间比较问题(即使使用普通 JDBC),这可能会导致 Hibernate 版本控制问题和时间类型的乐观锁定问题。
长答案
Hibernate User Guide 中提到了用于 Hibernate 的 MariaDB 方言(撰写本文时为 5.3)。提到的方言"short names"后面的备注是:
MariaDB: Support for the MariadB database. May work with newer versions
MariaDB53: Support for the MariadB database, version 5.3 and newer.
但是,可以在 Hibernate JavaDoc 中找到可用的官方 MariaDB 方言的完整列表。目前列出:
- org.hibernate.dialect.MariaDB102MariaDB 服务器 10.2 的方言
- org.hibernate.dialect.MariaDB103MariaDB 服务器 10.3 及更高版本的方言,提供序列支持。
- org.hibernate.dialect.MariaDB10MariaDB 服务器 10.0 和 10.1 的方言
- org.hibernate.dialect.MariaDB53MariaDB 服务器 5.3 及更高 5.x 版本的方言。
- org.hibernate.dialect.MariaDB 服务器 5.1 和 5.2 的 MariaDBDialect。
每个方言后继者都继承了前一个方言版本的设置。所以 MariaDB 的继承层次结构是:MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect
MariaDB 被设计为 MySQL 的直接替代品。但随着时间的推移,数据库可能会出现分歧。大多数基本功能可能没有问题,允许您交换 Connector/J 客户端(MySQL 服务器上的 MariaDB 客户端,反之亦然),并允许您交换方言(MySQL MariaDB 客户端上的方言和反之亦然)。但是存在细微的差异,可能会导致意想不到的问题。例如,MySQL Connector/J 客户端包含对服务器版本的硬编码检查,在使用 MariaDB 服务器时会失败,导致客户端中的某些功能被禁用,例如 MySQL sendFractionalSeconds 客户端参数。这将导致小数秒被禁用,因此小数部分将在 MySQL 客户端中被截断,但不会在 MariaDB 客户端中被截断。 (当使用 date/time 类型和非最大精度 SQL date/time 类型的版本控制时,这甚至可能导致乐观锁定问题。在这些情况下,使用最大精度 6。)
此外,MariaDB 方言有望为 MariaDB 提供特定功能: http://in.relation.to/2017/02/16/mariadb-dialects/
In time, we will add new Dialects based on newer capabilities introduced by MariaDB.
...
If you are using MariaDB, it’s best to use the MariaDB-specific Dialects from now on since it’s much easier to match the MariaDB version with its appropriate Hibernate Dialect.
并且https://hibernate.atlassian.net/browse/HHH-11457说:
since MySQL and MariaDB have gone in different directions, we might want to provide MariaDB Dialects as well.
For instance, it's not very intuitive for a Hibernate user to figure out that they need to use the MySQLInnoDb57Dialect to handle Timestamps with microsecond precision which have been available since MariaDB 5.3:
Hibernate 用户指南并未提供有关如何使用方言的所有使用信息。即使用户指南与 API 文档相结合也可能不够。有时您必须查看源代码以获取使用信息。例如,MariaDB53Dialect.java 包含可能有用的隐藏的非 JavaDoc 注释。
以前,对于 select MySQL 存储引擎,例如 MyISAM 或 InnoDB 或默认,您可以在 MySQL57InnoDBDialect
和 MySQL57Dialect
之间切换。但他们重构了从 Hibernate 5.2.8 开始的 MySQL 方言层次结构,如 Hibernate blog post 中所述。请注意,对于 select 存储引擎,您应该使用环境变量或系统 属性: hibernate.dialect.storage_engine
。例如:hibernate.dialect.storage_engine = innodb
。
XtraDB 是 MariaDB 10.1 及更早版本的默认 MariaDB 存储引擎,但从 10.2 开始它是 InnoDB。所以可能有些情况下你想明确提到 Hibernate selects 的存储引擎,那么你将不得不使用 storage_engine
变量。有关 storage_engine
变量的信息(用户指南中未提及),可在 AvailableSettings.java
.
如果您使用的 MariaDB 服务器早于 10.1.2(不支持小数秒),那么您可能需要向 JDBC URL,否则 MariaDB Connector/J 不会在内部截断时间戳,这会导致时间比较问题,这会导致 Hibernate 版本控制问题和临时类型的乐观锁定问题。