Hibernate的MariaDB方言类名是什么?

ss2ws0br  于 2023-10-20  发布在  其他
关注(0)|答案(4)|浏览(156)

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

nwlqm0z1

nwlqm0z11#

更新说明:Hibernate自动方言解析

在旧版本的Hibernate中,需要指定方言。但从3.2版开始,hibernate使用方言解析来自动确定目标数据库和应该使用的方言。
Hibernate 5.0用户指南说:

在大多数情况下Hibernate将能够通过在引导过程中询问JDBC连接的一些问题来确定要使用的正确方言。

如果由于某种原因无法确定正确的方言,或者您想使用自定义方言,则需要设置hibernate.dialect设置。
Hibernate 6.3用户指南甚至不鼓励你设置属性:
在Hibernate 6中,不再需要使用配置属性hibernate.dialect显式指定方言,因此现在不鼓励设置该属性**。(用户编写的自定义方言是一个例外。)
Hibernate 6.3 API文档说:
从Hibernate 6开始,不应该显式指定此属性,除非使用自定义用户编写的Dialect实现。相反,应用程序应该允许Hibernate自动选择方言

非常简短的回答

更新答案(2023年10月5日):

  • org.hibernate.dialect.MariaDB Dialect适用于MariaDB服务器10.3及更高版本

更新:其中一些类现在已经被弃用甚至删除:

  • org. hibernate. dialect.MariaDB 106 Dialect适用于MariaDB服务器10.6及更高版本,提供跳过锁定支持。
  • org. hibernate. dialect.MariaDB 103 Dialect适用于MariaDB服务器10.3及更高版本,提供序列支持。
  • org.hibernate.dialect.MariaDB 102 Dialect用于MariaDB服务器10.2
  • org.hibernate.dialect.MariaDB 10 Dialect适用于MariaDB服务器10.0和10.1
  • org.hibernate.dialect.MariaDB 53 Dialect适用于MariaDB服务器5.3及更高版本
  • 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. MariaDB Dialect用于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数据库。可用于较新版本
  • MariaDB 53:支持MariadB数据库,版本5.3及更新版本。

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

  • 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. MariaDB Dialect用于MariaDB服务器5.1和5.2。

每个方言后续版本都继承上一个方言版本的设置。MariaDB的继承层次是:MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect

MariaDB被设计成MySQL的替代品。但随着时间的推移,数据库可能会出现分歧。大多数基本功能可能都没有问题,允许您交换Connector/J客户端(MariaDB客户端在MySQL服务器上,反之亦然),并允许您交换方言(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版本与其相应的Hibernate方言匹配要容易得多。
https://hibernate.atlassian.net/browse/HHH-11457说:
由于MySQL和MariaDB的发展方向不同,我们可能也想提供MariaDB方言。
例如,对于Hibernate用户来说,他们需要使用MySQLInnoDb 57 Dialect来处理自MariaDB 5.3以来可用的微秒精度的时间戳并不是很直观:
Hibernate用户指南没有提供关于如何使用方言的所有使用信息。即使用户指南与API文档相结合也可能不够。有时候你必须在源代码中查找使用信息。例如,MariaDB53Dialect.java包含可能有用的隐藏非JavaDoc注解。
以前,要选择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(不支持小数秒),那么您可能需要为JDBC URL提供参数useFractionalSeconds=false,否则MariaDB Connector/J将不会在内部截断时间戳,这可能会导致时间比较问题,从而导致Hibernate版本控制问题和时态类型的乐观锁定问题。

mfpqipee

mfpqipee2#

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

org.hibernate.dialect.MariaDBDialect
都是可用的。公告最后指出,
如果您正在使用MariaDB,最好从现在开始使用MariaDB特定的方言,因为将MariaDB版本与其相应的Hibernate方言匹配要容易得多。

bweufnob

bweufnob3#

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

xcitsw88

xcitsw884#

你应该使用Mysql5Dialect,因为MariaDB与mysql兼容。
https://mariadb.com/kb/en/mariadb-vs-mysql-compatibility/#incompatibilities-between-mariadb-55-and-mysql-55

相关问题