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.
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.
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.
Hibernate.dialect
la propriété dit à Hibernate de générer le SQL consolidés pour la base de données choisie.
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
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.