Что такое имя класса диалектов MariaDB для Hibernate?

В 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?

Ответ 1

Как объявлено здесь, начиная с Hibernate ORM 5.2.8 (около 15 февраля 2017 года) диалекты

org.hibernate.dialect.MariaDB53Dialect

и

org.hibernate.dialect.MariaDBDialect

. В заявлении делается вывод о том, что

Если вы используете MariaDB, лучше всего использовать спецификацию MariaDB Диалекты отныне, так как их намного проще сопоставить с MariaDB версии с соответствующим диалогом Hibernate.

Ответ 2

Очень короткий ответ

Текущие диалекты на момент написания статьи:

  • 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 для сервера 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.

Обратите внимание, что для получения подробной информации об использовании вам иногда придется искать исходные коды на диалекте. (В некоторых источниках на диалектах есть комментарии к информации об использовании не JavaDoc.)

Если вы хотите изменить или явно упомянуть механизм хранения для диалекта MariaDB, вы можете использовать переменную storage_engine Hibernate. Например: hibernate.dialect.storage_engine = innodb. IMO, вы должны сделать это явно, потому что значение по умолчанию может измениться при переключении на другую версию сервера MariaDB.

Если вы используете сервер MariaDB старше 10.1.2 (который не поддерживает доли секунды), то вы можете useFractionalSeconds=false параметр useFractionalSeconds=false для URL-адреса JDBC, в противном случае MariaDB Connector/J не будет усекать временные метки внутренне, что может вызвать проблему сравнения времени, когда эти значения используются в запросах сравнения (даже при использовании простого JDBC), что может вызвать проблемы управления версиями Hibernate и проблемы с оптимистической блокировкой для временных типов.

Длинный ответ

Диалект MariaDB для Hibernate (5.3 на момент написания) упоминается в Руководстве пользователя Hibernate. Упомянутый диалект "короткие имена", за которым следуют замечания:

  • MariaDB: Поддержка базы данных MariadB. Может работать с новыми версиями

  • MariaDB53: Поддержка базы данных MariadB, версия 5.3 и новее.

Тем не менее, полный список доступных официальных диалектов MariaDB можно найти в Hibernate JavaDoc. Который в настоящее время перечисляет:

  • 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.

Каждый преемник диалекта наследует настройки от предыдущей версии диалекта. Итак, MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect наследования для MariaDB: MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect

MariaDB был разработан как замена для MySQL. Но базы данных, вероятно, будут расходиться с течением времени. Большинство основных функций, вероятно, работают без проблем, позволяя вам поменять местами клиенты Connector/J (клиент MariaDB на сервере MySQL и наоборот), а также поменять местами диалекты (диалект MySQL на клиенте MariaDB и наоборот). Но есть небольшие различия, которые могут вызвать неожиданные проблемы. Например, клиент 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 не очень интуитивно понятно, что им нужно использовать MySQLInnoDb57Dialect для обработки меток времени с точностью до микросекунды, которые доступны с MariaDB 5.3:

Руководство пользователя Hibernate не содержит всей информации об использовании диалектов. Даже руководство пользователя в сочетании с документами API может быть недостаточно. Иногда вам придется искать в исходных кодах информацию об использовании. Например, MariaDB53Dialect.java содержит скрытые комментарии, отличные от JavaDoc, которые могут быть полезны.

Ранее, чтобы выбрать механизм хранения MySQL, такой как MyISAM или InnoDB или по умолчанию, вы могли переключаться между, например, MySQL57InnoDBDialect и MySQL57Dialect. Но они реорганизовали иерархию диалектов MySQL, начиная с Hibernate 5.2.8, как упоминалось в блоге Hibernate. Обратите внимание, что для выбора механизма хранения вы должны использовать переменную среды или системное свойство: hibernate.dialect.storage_engine. Например: hibernate.dialect.storage_engine = innodb.

XtraDB был механизмом хранения MariaDB по умолчанию для MariaDB 10.1 и более ранних версий, но с 10.2 это InnoDB. Поэтому могут быть случаи, когда вы хотите явно упомянуть механизм хранения, storage_engine Hibernate, поэтому вам придется использовать переменную storage_engine. Информацию о переменной storage_engine (которая не упомянута в руководстве пользователя) можно найти в источнике AvailableSettings.java.

Если вы используете сервер MariaDB старше 10.1.2 (который не поддерживает доли секунды), то вы можете useFractionalSeconds=false параметр useFractionalSeconds=false для URL-адреса JDBC, в противном случае MariaDB Connector/J не будет усекать временные метки внутренне, что может вызвать проблему сравнения времени, которая может вызвать проблемы управления версиями Hibernate и проблемы с оптимистической блокировкой для временных типов.

Ответ 3

Вы должны использовать Mysql5Dialect, потому что MariaDB на 100% совместим с mysql.