Pourquoi dois-je configurer le dialecte SQL d'une source de données?

lorsque nous configurons une source de données en utilisant hibernation, nous devrions ajouter le hibernate.dialect propriété (ou eclipselink.target-database si vous utilisez EclipseLink).

je veux savoir ce que signifie dialecte<!--6? Je configure cette propriété en fonction de la documentation D'hibernation mais je ne sais pas ce que cela signifie.

45
demandé sur Brian Drummond 2014-01-09 10:09:21

11 réponses

Dialecte signifie "la variante d'une langue". L'hibernation, comme nous le savons, est agnostique à la base de données. Il peut fonctionner avec différentes bases de données. Cependant, les bases de données ont des extensions propriétaires/des variations SQL natives, et un ensemble/sous-ensemble D'implémentations standards SQL. Par conséquent, à un moment donné, hibernate doit utiliser SQL spécifique à la base de données. Hibernate utilise la configuration "dialecte" pour savoir quelle base de données vous utilisez afin qu'il puisse passer au Code du générateur SQL spécifique à la base de données où/quand nécessaire.

78
répondu RaviH 2014-01-09 06:17:15

brève réponse

"l'ironie de JDBC est que, bien que les interfaces de programmation soient portable, le langage SQL ne l'est pas. Malgré les nombreuses tentatives standardiser, il est encore rare d'écrire SQL de n'importe quelle complexité qui s'exécute sans changement sur deux plates-formes de base de données principales. Même là où le SQL les dialectes sont similaires, chaque base de données effectue différemment selon la structure de la requête, nécessitant un accord spécifique au fournisseur la plupart des cas."

..volé Pro JPA 2 Mastering the Java Persistence API, chapitre 1, page 9

donc, nous pourrions penser à JDBC comme la spécification ultime qui résume tout ce qui concerne les bases de données, mais ce n'est pas le cas.

Une citation de l' spécification JDBC, chapitre 4.4, page 20:

la couche pilote différences de masque entre la syntaxe standard SQL:2003 et le dialecte natif pris en charge par la source de données.

n'est pas une garantie que le pilote , et par conséquent, nous devons fournir le dialecte afin d'avoir une application de travail. Dans le meilleur des cas, l'application fonctionnera mais pourrait ne pas fonctionner aussi efficacement que si le fournisseur de persistance savait quel dialecte utiliser. Dans le cas D'hibernation, il refusera de déployer votre application à moins que vous ne l'alimentiez. dialecte.

Ce sujet JPQL alors?

la spécification JDBC ne mentionne pas le mot JPQL. JDBC est un moyen standard de base de données accès. Aller lire ce JavaDoc et vous constaterez qu'une fois que l'application peut accéder à la base de données, ce qui doit être introduit dans le pilote conforme JDBC est vanilla = non décorée SQL.

il est intéressant de noter que JPQL est un langage de requête, Pas une définition de données language (DDL). Donc même si nous pouvions alimenter le pilote JDBC avec JPQL, cela ne serait d'aucune utilité pour le fournisseur de persistance pendant la phase d'analyse du persistence.xml fichier et mise en place des tables.

pour en savoir plus sur la propriété

pour votre référence, voici un exemple pour Hibernate et EclipseLink sur la façon de spécifier un dialecte Java DB dans la persistance.fichier xml:

<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/>
<property name="eclipselink.target-database" value="JavaDB"/>

la propriété Est-elle obligatoire?

En théorie, la propriété n'a pas été standardisés et de l' spécification JPA 2.1 ne dit pas un mot sur les dialectes SQL. Nous n'avons donc pas de chance et nous devons nous tourner vers des études empiriques spécifiques au fournisseur et leur documentation.

hibernation refusez d'accepter une archive de déploiement qui n'a pas spécifié la propriété rendant l'archive Non déployable. Documentation sur L'hibernation dit:

Toujours mettre l'hibernation.la propriété dialecte à la correcte org.hiberner.dialecte.Sous-classe de dialecte pour votre base de données.

Donc c'est assez clair. Notez que les dialectes énumérés dans la documentation ciblent spécifiquement l'un ou l'autre fournisseur. Il n'y a pas de dialecte" générique " ou quelque chose comme ça. Étant donné que la propriété est une condition absolue pour un déploiement réussi, vous vous attendez à ce que le documentation du serveur D'application WildFly qui rassemble Hibernate devrait dire quelque chose, mais il ne fait pas.

EclipseLink sur l'autre main est un peu plus indulgent. Si vous ne fournissez pas la propriété, le déploiement déploie (sans avertissement). Documentation sur EclipseLink dit:

utilisez le lien d'éclipse.cible-propriété de base de données pour spécifier la base de données pour utiliser, contrôler les opérations personnalisées et la génération SQL base de données spécifiée.

on parle de " custom operations and SQL génération", ce qui signifie qu'il est un peu vague, si vous me demandez. Mais une chose est claire: Ils ne disent pas que la propriété est obligatoire. Notez également que l'une des valeurs disponibles est "Database" qui représente la cible "a generic database". Hmm, quel "dialecte" ce serait? SQL 2.0?? Mais encore une fois, la propriété est appelée "cible-base de données" et pas "dialecte" donc peut-être "Base de données" se traduit par aucun SQL du tout lol. Passons au serveur GlassFish qui offre EclipseLink. Documentation (page "6-3") dit:

Vous pouvez spécifier l'option eclipselink.cible-propriété de base de données garantir que le type de base de données est correct.

donc GlassFish fait valoir que la propriété est "optionnelle" et que la valeur ajoutée est une "garantie" que j'utilise effectivement Java DB - au cas où je ne le savais pas.

Conclusion

copiez-collez tout ce que vous pouvez trouver sur google et priez Dieu.

29
répondu Martin Andersson 2015-04-26 09:24:27

Hibernate.dialect la propriété dit à Hibernate de générer le SQL consolidés pour la base de données choisie.

http://javamanikandan.blogspot.in/2014/05/sql-dialects-in-hibernate.html

RDBMS                   Dialect
DB2                     org.hibernate.dialect.DB2Dialect
DB2 AS/400              org.hibernate.dialect.DB2400Dialect
DB2 OS390               org.hibernate.dialect.DB2390Dialect
PostgreSQL              org.hibernate.dialect.PostgreSQLDialect
MySQL                   org.hibernate.dialect.MySQLDialect
MySQL with InnoDB       org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM       org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version)    org.hibernate.dialect.OracleDialect
Oracle 9i/10g           org.hibernate.dialect.Oracle9Dialect
Sybase                  org.hibernate.dialect.SybaseDialect
Sybase Anywhere         org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server    org.hibernate.dialect.SQLServerDialect
SAP DB                  org.hibernate.dialect.SAPDBDialect
Informix                org.hibernate.dialect.InformixDialect
HypersonicSQL           org.hibernate.dialect.HSQLDialect
Ingres                  org.hibernate.dialect.IngresDialect
Progress                org.hibernate.dialect.ProgressDialect
Mckoi SQL               org.hibernate.dialect.MckoiDialect
Interbase               org.hibernate.dialect.InterbaseDialect
Pointbase               org.hibernate.dialect.PointbaseDialect
FrontBase               org.hibernate.dialect.FrontbaseDialect
Firebird                org.hibernate.dialect.FirebirdDialect
14
répondu Mani 2014-05-18 08:11:04

brève réponse

hibernate.dialect la propriété fait hiberner pour générer les instructions SQL appropriées pour la base de données choisie.

5
répondu Sri Harsha Kappala 2014-01-09 06:34:09

le dialecte est le SQL dialecte que votre base de données utilise.

liste des dialectes SQL