什么是Hibernate的MariaDB方言类名?

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

在Hibernate中,MySQL5方言的名字是

org.hibernate.dialect.MySQL5Dialect 

对于Oracle 10g

 org.hibernate.dialect.Oracle10gDialect 

MariaDB的方言类名是什么?

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

org.hibernate.dialect.MariaDB53Dialect

org.hibernate.dialect.MariaDBDialect

可用。 该公告的结论是

如果您使用的是MariaDB,那么从现在开始最好使用MariaDB特定的Dialects,因为将MariaDB版本与其相应的Hibernate Dialect相匹配要容易得多。

你应该使用Mysql5Dialect,因为MariaDB与mysql 100%兼容。

从这里开始 ,它被提到“它需要是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并提交

TL; DR

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

目前,Hibernate用户指南中未提及可用的MariaDB方言的完整列表,但在Hibernate JavaDoc中未提及。 根据您的MariaDB版本,您应该选择相应的方言版本。

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

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

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

详细的答案

Hibernate用户指南中提到了用于Hibernate的MariaDB方言(撰写本文时为5.3)。 所提到的方言“短名称”后面的评论是:

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

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

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

  • org.hibernate.dialect.MariaDB102Dialect:MariaDB 10.2
  • org.hibernate.dialect.MariaDB103Dialect:MariaDB 10.3及更高版本,提供序列支持。
  • org.hibernate.dialect.MariaDB10Dialect
  • org.hibernate.dialect.MariaDB53Dialect:MariaDB 5.3
  • org.hibernate.dialect.MariaDBDialect

每个方言inheritance者都inheritance了先前方言版本的设置。 所以MariaDB的inheritanceMariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect是: MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect

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

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

随着时间的推移,我们将根据MariaDB引入的新function添加新的Dialects。

如果您使用的是MariaDB,那么从现在开始最好使用MariaDB特定的Dialects,因为将MariaDB版本与其相应的Hibernate Dialect相匹配要容易得多。

并且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的源代码中找到。

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