在 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 的方言类名称是什么?
答案 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)
撰写本文时,当前的方言是:
使用MariaDB服务器时,您应使用MariaDB Connector / J和MariaDB Hibernate方言,而不是MySQL方言。即使MariaDB是作为替代产品创建的,即使使用MySQL版本的基本功能可能会起作用,也会出现细微问题,或者您可能会错过某些功能。
《 Hibernate用户指南》目前没有提到可用的MariaDB方言的完整列表,但在Hibernate JavaDoc中却没有提及。 根据您的MariaDB服务器版本,您应该选择相应的方言版本。截至撰写本文时,当前的方言是:
请注意,有关详细的用法信息,有时您必须查看方言源代码。 (某些方言来源中有非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方言的完整列表。当前列出的内容:
每个方言的后继者都继承以前的方言版本的设置。因此,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或默认),可以在MySQL57InnoDBDialect
和MySQL57Dialect
之间切换。但他们{@ 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;