什么是Hibernate的MariaDB方言类名?

时间:2016-05-06 06:47:14

标签: java database 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 的方言类名称是什么?

4 个答案:

答案 0 :(得分:16)

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

org.hibernate.dialect.MariaDB53Dialect

org.hibernate.dialect.MariaDBDialect

可用。公告的结论是

  

如果您使用的是MariaDB,最好使用MariaDB特定的   从现在开始的方言,因为它更容易匹配MariaDB   具有适当的Hibernate方言的版本。

答案 1 :(得分:10)

很简短的答案

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

  • 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版本的基本功能可能会起作用,也会出现细微问题,或者您可能会错过某些功能。

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

  • org.hibernate.dialect.MariaDB102Dialect for MariaDB服务器10.2
  • 用于MariaDB服务器10.3和更高版本的
  • org.hibernate.dialect.MariaDB103Dialect,提供序列支持。
  • org.hibernate.dialect.MariaDB10Dialect for MariaDB服务器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 User Guide中提到了适用于Hibernate的MariaDB方言(截至本文撰写时为5.3)。所提到的方言“简称”及其后的备注是:

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

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

  •   

但是,可以在Hibernate JavaDoc中找到可用的正式MariaDB方言的完整列表。当前列出的内容:

  • org.hibernate.dialect.MariaDB102Dialect for MariaDB服务器10.2
  • 用于MariaDB服务器10.3和更高版本的
  • org.hibernate.dialect.MariaDB103Dialect,提供序列支持。
  • org.hibernate.dialect.MariaDB10Dialect for 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 > 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更容易   版本及其相应的休眠方言。

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

  

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

     

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

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

以前,要选择MySQL存储引擎(例如MyISAM或InnoDB或默认),可以在MySQL57InnoDBDialectMySQL57Dialect之间切换。但他们{@ 3}重构了从Hibernate 5.2.8开始的MySQL方言层次结构。请注意,要选择存储引擎,应使用环境变量或系统属性:hibernate.dialect.storage_engine。例如:hibernate.dialect.storage_engine = innodb

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:3)

来自here,有人提到过 &#34;它需要是MySQL5InnoDBDialect或MySQL57InnoDBDialect而不是MySQLInnoDBDialect&#34;

有关完整列表,请参阅 http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#database-dialect

5.2.17中添加了新的MariaDB方言。请参阅JIRAcommit