【问题标题】: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 的方言类名是什么?

【问题讨论】:

    标签: java database hibernate 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 方言。见JIRAcommit

      【讨论】:

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

      【讨论】:

      • 这不是真的!
      • MariaDB 显然不兼容mysql。
      • @FrancisNiu 如您所见,答案是从 2016 年开始,今年 dbms 是兼容的。
      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2011-02-22
      • 2017-01-31
      • 2012-11-27
      • 2019-07-17
      相关资源
      最近更新 更多