web-dev-qa-db-fra.com

Quel est le nom de la classe de dialecte MariaDB pour Hibernate?

Dans Hibenate j'utilise MariaDB mais je n'ai pas trouvé le nom de la classe de dialecte MariaDB.

Dans Hibernate, le nom du dialecte MySQL5 est

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

Pour Oracle 10g

<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

Quel est le nom de la classe de dialecte pour MariaDB?

16

Comme annoncé ici , à partir d'Hibernate ORM 5.2.8 (vers le 15 février 2017), les dialectes

org.hibernate.dialect.MariaDB53Dialect

et

org.hibernate.dialect.MariaDBDialect

sont disponibles. L'annonce conclut que

Si vous utilisez MariaDB, il est préférable d'utiliser les dialectes spécifiques à MariaDB à partir de maintenant, car il est beaucoup plus facile de faire correspondre la version MariaDB avec son dialecte Hibernate approprié.

21
l00tr

Réponse très courte

Les dialectes actuels à ce jour sont:

  • org.hibernate.dialect. MariaDB102Dialect pour le serveur MariaDB 10.2
  • org.hibernate.dialect. MariaDB103Dialect pour le serveur MariaDB 10.3 et versions ultérieures , fournit un support de séquence.
  • org.hibernate.dialect. MariaDB10Dialect pour le serveur MariaDB 10.0 et 10.1
  • org.hibernate.dialect. MariaDB53Dialect pour le serveur MariaDB 5.3, et versions ultérieures 5.x .
  • org.hibernate.dialect. MariaDBDialect pour le serveur MariaDB 5.1 et 5.2 .

Réponse courte

Lorsque vous utilisez un serveur MariaDB, vous devez utiliser les dialectes MariaDB Connector/J et MariaDB Hibernate, pas ceux MySQL . Même si MariaDB a été créé comme un remplacement direct et même si les fonctionnalités de base fonctionneront probablement lors de l'utilisation des versions MySQL de celles-ci, des problèmes subtils peuvent se produire ou vous pouvez manquer certaines fonctionnalités.

Une liste complète des dialectes MariaDB disponibles n'est actuellement pas mentionnée dans le Guide de l'utilisateur Hibernate, mais dans Hibernate JavaDoc . En fonction de la version de votre serveur MariaDB, vous devez sélectionner la version de dialecte correspondante . Les dialectes actuels à ce jour sont:

  • org.hibernate.dialect.MariaDB102Dialect pour le serveur MariaDB 10.2
  • org.hibernate.dialect.MariaDB103Dialect pour le serveur MariaDB 10.3 et versions ultérieures, prend en charge les séquences.
  • org.hibernate.dialect.MariaDB10Dialect pour le serveur MariaDB 10.0 et 10.1
  • org.hibernate.dialect.MariaDB53Dialect pour MariaDB server 5.3 et versions ultérieures 5.x.
  • org.hibernate.dialect.MariaDBDialect pour les serveurs MariaDB 5.1 et 5.2.

Notez que pour des informations détaillées sur l'utilisation, vous devrez parfois chercher dans les codes sources du dialecte. (Il existe des commentaires d'informations d'utilisation non JavaDoc dans certaines sources de dialecte.)

Si vous souhaitez modifier ou mentionner explicitement le moteur de stockage pour le dialecte MariaDB, vous pouvez utiliser le storage_engine Variable de mise en veille prolongée. Par exemple: hibernate.dialect.storage_engine = innodb. IMO, vous devez le faire explicitement, car la valeur par défaut peut changer lors du passage à une version de serveur MariaDB différente.

Si vous utilisez un serveur MariaDB antérieur à 10.1.2 (qui ne prend pas en charge les fractions de seconde), vous souhaiterez peut-être fournir le paramètre useFractionalSeconds=false à l'URL JDBC, sinon MariaDB Connector/J ne tronquera pas les horodatages en interne, ce qui peut provoquer un problème de comparaison de temps lorsque ces valeurs sont utilisées dans des requêtes de comparaison (même en utilisant du JDBC ordinaire), ce qui peut entraîner des problèmes de version Hibernate et des problèmes de verrouillage optimistes pour les types temporels.

Longue réponse

Le dialecte MariaDB pour Hibernate (5.3 au moment de la rédaction de cet article) est mentionné dans le Hibernate User Guide . Les dialectes mentionnés "noms abrégés" suivis de remarques sont:

  • MariaDB: Prise en charge de la base de données MariadB. Peut fonctionner avec des versions plus récentes

  • MariaDB53: Prise en charge de la base de données MariadB, version 5.3 et plus récente.

Cependant, une liste complète des dialectes officiels MariaDB disponibles peut être trouvée dans le Hibernate JavaDoc . Qui répertorie actuellement:

  • org.hibernate.dialect.MariaDB102Dialect pour le serveur MariaDB 10.2
  • org.hibernate.dialect.MariaDB103Dialect pour le serveur MariaDB 10.3 et versions ultérieures, prend en charge les séquences.
  • org.hibernate.dialect.MariaDB10Dialect pour le serveur MariaDB 10.0 et 10.1
  • org.hibernate.dialect.MariaDB53Dialect pour le serveur MariaDB 5.3 et les versions ultérieures 5.x.
  • org.hibernate.dialect.MariaDBDialect pour les serveurs MariaDB 5.1 et 5.2.

Chaque successeur de dialecte hérite des paramètres de la version de dialecte précédente. La hiérarchie d'héritage de MariaDB est donc: MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect

MariaDB a été conçu pour remplacer directement MySQL. Mais les bases de données vont probablement diverger avec le temps. La plupart des fonctionnalités de base fonctionnent probablement sans problème, vous permettant d'échanger des clients Connector/J (client MariaDB sur le serveur MySQL et vice versa), et vous permettent d'échanger des dialectes (dialecte MySQL sur le client MariaDB et vice versa). Mais il existe des différences subtiles qui peuvent provoquer des problèmes inattendus. Par exemple, le client MySQL Connector/J contient des vérifications codées en dur pour la version du serveur, qui échouera lors de l'utilisation d'un serveur MariaDB, entraînant la désactivation de certaines fonctionnalités dans le client, comme le paramètre client MySQL sendFractionalSeconds. Cela entraînera la désactivation des fractions de seconde, donc les fractions seront tronquées dans le client MySQL mais pas dans le client MariaDB. (Cela peut même conduire à des problèmes de verrouillage optimistes lors de l'utilisation du contrôle de version avec des types de date/heure en combinaison avec des types de date/heure SQL de précision non maximale. Dans ces cas, utilisez la précision maximale de 6.)

En outre, le dialecte MariaDB devrait fournir des fonctionnalités spécifiques pour MariaDB: http://in.relation.to/2017/02/16/mariadb-dialects/

Avec le temps, nous ajouterons de nouveaux dialectes basés sur les nouvelles capacités introduites par MariaDB.

...

Si vous utilisez MariaDB, il est préférable d'utiliser les dialectes spécifiques à MariaDB à partir de maintenant, car il est beaucoup plus facile de faire correspondre la version MariaDB avec son dialecte Hibernate approprié.

Et https://hibernate.atlassian.net/browse/HHH-11457 dit:

comme MySQL et MariaDB sont allés dans des directions différentes, nous pourrions aussi vouloir fournir des dialectes MariaDB.

Par exemple, il n'est pas très intuitif pour un utilisateur d'Hibernate de comprendre qu'il doit utiliser MySQLInnoDb57Dialect pour gérer les horodatages avec une précision en microsecondes qui sont disponibles depuis MariaDB 5.3:

Le Guide de l'utilisateur d'Hibernate ne fournit pas toutes les informations sur l'utilisation des dialectes. Même le Guide de l'utilisateur se combine avec les documents de l'API peut ne pas être suffisant. Parfois, vous devrez rechercher dans les codes source des informations d'utilisation. Par exemple, MariaDB53Dialect.Java contient des commentaires cachés non JavaDoc qui peuvent être utiles.

Auparavant, pour sélectionner un moteur de stockage MySQL, tel que MyISAM ou InnoDB ou par défaut, vous pouviez basculer entre par exemple MySQL57InnoDBDialect et MySQL57Dialect. Mais ils ont refactorisé la hiérarchie des dialectes MySQL à partir d'Hibernate 5.2.8, comme mentionné dans un article de blog Hibernate . Notez que pour sélectionner un moteur de stockage, vous devez utiliser une variable d'environnement ou une propriété système: hibernate.dialect.storage_engine. Par exemple: hibernate.dialect.storage_engine = innodb.

XtraDB était le moteur de stockage MariaDB par défaut pour MariaDB 10.1 et versions antérieures, mais depuis 10.2, c'est InnoDB. Il peut donc y avoir des cas où vous souhaitez mentionner explicitement le moteur de stockage sélectionné par Hibernate, vous devrez donc utiliser le storage_engine variable. Infos sur le storage_engine variable (qui n'est pas mentionnée dans le Guide de l'utilisateur), peut être trouvée dans la source de AvailableSettings.Java .

Si vous utilisez un serveur MariaDB antérieur à 10.1.2 (qui ne prend pas en charge les fractions de seconde), vous souhaiterez peut-être fournir le paramètre useFractionalSeconds=false à l'URL JDBC, sinon MariaDB Connector/J ne tronquera pas les horodatages en interne, ce qui peut entraîner un problème de comparaison de temps, ce qui peut entraîner des problèmes de version Hibernate et des problèmes de verrouillage optimiste pour les types temporels.

17
Devabc

Vous devez utiliser Mysql5Dialect, car MariaDB est 100% compatible avec mysql.

4
Jens

De ici , il a été mentionné "il doit être MySQL5InnoDBDialect ou MySQL57InnoDBDialect au lieu de MySQLInnoDBDialect"

Pour la liste complète, voir http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#database-dialect

Le nouveau dialecte MariaDB est ajouté en 5.2.17. Voir JIRA et commit

3
maximilianus