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.
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.
"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.
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.
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"/>
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.
Copiez-collez tout ce que vous pouvez trouver sur Google et priez Dieu.
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
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
Réponse courte
hibernate.dialect
permet à Hibernate de générer les instructions SQL appropriées pour la base de données choisie.
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.
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.
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.
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.
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.
La propriété dialecte est utilisée par hibernation des manières suivantes