web-dev-qa-db-fra.com

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

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

Je veux savoir quelle est la signification de dialecte? Je configure cette propriété conformément à la documentation d'Hibernate mais je ne sais pas quelle est sa signification.

52
Captain Kidd

Dialecte signifie "la variante d'une langue". Comme nous le savons, Hibernate est une base de données agnostique. Il peut fonctionner avec différentes bases de données. Cependant, les bases de données ont des extensions propriétaires/variantes natives SQL et un ensemble/sous-ensemble d'implémentations standard SQL. Par conséquent, à un moment donné, hibernate doit utiliser SQL spécifique à la base de données. Hibernate utilise une configuration "dialecte" pour savoir quelle base de données vous utilisez afin de pouvoir basculer vers le code du générateur SQL spécifique à la base de données à tout moment.

90
RaviH

Réponse courte

"L’ironie de JDBC est que, bien que les interfaces de programmation soient portables, le langage SQL ne le soit pas. Malgré les nombreuses tentatives de le standardiser, il est encore rare d’écrire du SQL, quelle que soit sa complexité, qui ne fonctionnera pas sur deux grandes plates-formes de bases de données. Même Lorsque les dialectes SQL sont similaires, chaque base de données fonctionne différemment en fonction de la structure de la requête, ce qui nécessite dans la plupart des cas un réglage spécifique au fournisseur. "

..stolen from Pro JPA 2 Maîtriser le Java API de persistance , chapitre 1, page 9

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

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

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

May == n'est pas une garantie que le pilote sera , et nous devrions donc fournir le dialecte pour avoir une application opérationnelle. Dans le meilleur des cas, l'application fonctionnera mais ne fonctionnera pas aussi efficacement que si le fournisseur de persistance savait quel dialecte utiliser. Dans le cas d'Hibernate, il refusera de déployer votre application à moins que vous ne lui donniez le dialecte.

Qu'en est-il de [~ # ~] jpql [~ # ~] alors?

La spécification JDBC ne mentionne pas le Word JPQL. JDBC est un moyen normalisé de base de données access . Allez 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 compatible JDBC est Vanilla. = non décoré SQL.

Il est à noter que JPQL est un langage de requête, pas un langage de définition de données (DDL). Ainsi, 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 fichier persistence.xml Et de configuration des tables.

Regarder de plus près la propriété

Pour votre information, voici un exemple pour Hibernate et EclipseLink expliquant comment spécifier un dialecte de base de données Java dans le fichier persistence.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é normalisée et la spécification JPA 2.1 ne dit pas un mot sur les dialectes SQL. Nous n’avons donc pas de chance et devons nous tourner vers des études empiriques spécifiques à chaque fournisseur et leur documentation.

Hibernate refuse d'accepter une archive de déploiement qui n'a pas spécifié la propriété rendant l'archive non déployable. La documentation d'Hibernate indique:

Définissez toujours la propriété hibernate.dialect sur la sous-classe org.hibernate.dialect.Dialect appropriée pour votre base de données.

Donc c'est assez clair. Notez que les dialectes répertorié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 exigence absolue pour un déploiement réussi, vous vous attendriez à ce que la documentation du serveur d'applications WildFly qui regroupe Hibernate devrait dire quelque chose, mais ce n'est pas le cas.

EclipseLink par contre est un peu plus indulgent. Si vous ne fournissez pas la propriété, le déploiement est déployé (sans avertissement également). La documentation EclipseLink indique:

Utilisez la propriété eclipselink.target-database pour spécifier la base de données à utiliser, en contrôlant les opérations personnalisées et la génération SQL pour la base de données spécifiée.

On parle "d'opérations personnalisées et de génération SQL", ce qui signifie que c'est un peu vague si vous me le 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 "Base de données" qui représente la cible "une base de données générique". Hmm, quel "dialecte" serait-ce? SQL 2.0 ?? Mais là encore, la propriété s'appelle "cible-base de données" et non pas "dialecte", alors peut-être que "Base de données" ne correspond à aucun SQL, lol. Passage au serveur GlassFish qui regroupe EclipseLink. La documentation (page "6-3") dit:

Vous pouvez spécifier la propriété facultative eclipselink.target-database pour garantir que le type de base de données est correct.

Donc, GlassFish soutient que la propriété est "facultative" et que la valeur ajoutée est une "garantie" que j'utilise réellement Java DB - au cas où je ne le saurais pas.

Conclusion

Copiez-collez tout ce que vous pouvez trouver sur Google et priez Dieu.

29
Martin Andersson

Hibernate.dialect _ propriété indique à Hibernate de générer les instructions appropriées [~ # ~] sql [~ # ~] pour la base de données choisie.

Une liste des dialectes disponibles peut être trouvée ici: 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
19
Mani

Le dialecte est le dialecte SQL utilisé par votre base de données.

Liste des dialectes SQL pour Hibernate.

Indiquez-le dans hibernate.cfg.xml en tant que:

<hibernate-configuration>
   <session-factory name="session-factory">
      <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
       ...
   </session-factory>
</hibernate-configuration>

ou dans le fichier de propriétés en tant que:

hibernate.dialect=org.hibernate.dialect.SQLServerDialect
5
K.C.

Réponse courte

hibernate.dialect permet à Hibernate de générer les instructions SQL appropriées pour la base de données choisie.

5
Sri Harsha Kappala

Hibernate utilise une configuration "dialecte" pour savoir quelle base de données vous utilisez afin de pouvoir convertir une requête Hibernate en requête spécifique à la base.

4
vishal thakur

Le dialecte dans le contexte Hibernate, s’occupera du type de données de la base de données, comme dans orace c’est un entier, mais en SQL, c’est int.

2
Usman Zafar Malik

Les bases de données implémentent des différences subtiles dans le SQL qu'elles utilisent. Des éléments tels que les types de données, par exemple, varient selon les bases de données (par exemple, dans Oracle. Vous pouvez placer une valeur entière dans un champ numérique et utiliser dans SQL Server un champ int). Ou fonctionnalité spécifique à la base de données - la sélection des n premières lignes est différente selon la base de données. Le dialecte résume ceci afin que vous n'ayez pas à vous en préoccuper.

2
Pradeep Kr Kaushal

Le dialecte SQL convertit la requête HQL que nous écrivons dans notre Java ou tout autre programme orienté objet vers la base de données SQL spécifique).

Par exemple, dans le Java supposons que j'écrive Liste employés = session.createQuery ("FROM employé"). List ();

mais quand mon dialecte est <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect

La HQL ("FROM Employee") est convertie en "SELECT * FROM EMPLOYEE" avant de frapper la base de données MySQL.

2
Sarita

Un dialecte est une forme de la langue parlée par un groupe de personnes particulier.

Ici, dans le contexte du cadre d'hibernation, quand l'hibernation veut parler (à l'aide de requêtes) avec la base de données, il utilise des dialectes.

Les dialectes SQL sont dérivés du langage de requête structuré, qui utilise des expressions lisibles par l'homme pour définir des instructions de requête.
Un dialecte en hibernation donne des informations sur la manière de convertir hibernate queries (HQL) dans les requêtes SQL natives.

Le dialecte de hibernation peut être configuré en utilisant la propriété ci-dessous:

hibernate.dialect

Here , est une liste complète des dialectes en veille prolongée.

Remarque: La propriété dialecte de hibernate est et non obligatoire.

1
Rohit Gaikwad

La propriété dialecte est utilisée par hibernation des manières suivantes

  1. Pour générer des requêtes SQL optimisées.
  2. Si vous avez plus d'une base de données, parlez à la base de données souhaitée.
  3. Pour définir les valeurs par défaut des propriétés du fichier de configuration Hibernate en fonction du logiciel de base de données utilisé, même si elles ne sont pas spécifiées dans le fichier de configuration.
0
Praveen