什么是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或默认,您可以在MySQL57InnoDBDialect
和MySQL57Dialect
之间切换。 但他们从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版本问题和时间类型的乐观锁定问题。
- Hibernate:Hibernate总是使用对象代理吗?
- Hibernate的Transformers.aliasToBean()方法
- hibernate。 ClassicQueryTranslatorFactory与ASTQueryTranslatorFactory
- Hibernate多个本机SQL语句
- 带有2个数据库配置的Spring Boot – 使用第二个配置延迟加载不起作用
- 如何使用Hibernate处理多个数据库模式?
- 是否有充分的理由使用XML而不是通过注释配置hibernate?
- @BatchSize但在@ManyToOne案例中有很多往返
- 在只读模式下不允许执行Spring Write操作