2010-12-16 126 views
6

Hibernate est indépendant de la base de données. Ainsi, quelle que soit la base de données que nous utiliserons dans notre application, nous devons définir le dialecte associé à cette base de données.Dialect in Hibernate

Par exemple, supposons que nous utilisons base de données MySQL, alors nous avons besoin ci-dessous dialecte: org.hibernate.dialect.MySQLDialect

Supposons que nous utilisons la base de données SQL Server, nous avons besoin ci-dessous dialecte: org.hibernate .dialect.SQLServerDialect

Hibernate générera une requête appropriée liée à cette base de données. Ma question est: Quel mécanisme utilisé par hibernate pour générer des requêtes basées sur la base de données?

Répondre

9

Je ne sais pas bien compris votre question, mais je vais essayer :-)

D'abord, il sont des choses qui fonctionne dans toutes les bases de données, tandis que d'autres choses sont spécifiques à certaines bases de données (comme « ce qui est la date et l'heure actuelles? "). Pour les choses qui fonctionnent dans toutes les bases de données, il n'y a rien de vraiment spécifique aux dialectes.

Mais pour toutes les parties qui peuvent être différentes d'une base de données à une autre, Hibernate utilise le dialecte. Dialect est un "assistant" pour Hibernate pour communiquer avec la base de données dans sa langue. Par exemple, à un certain point, un code Hibernate doit savoir quel est le type de données de base de données pour le type JDBC "Types.TIMESTAMP". Le code "noyau" d'Hibernate dit simplement "donne-moi ce qui est cet équivalent db de Types.TIMESTAMP", et le dialecte spécifique répond à cela.

La même chose se produit pour la génération SQL (ou la génération de requêtes, comme vous l'avez demandé). Hibernate connaît la structure de base, mais il fournit aussi des crochets dans le dialecte pour qu'un dialecte spécifique puisse dire «je ne supporte pas la fonctionnalité X» ou «pour la caractéristique Y, utilise la chaîne 'abc' dans la requête».

Bien sûr, ma réponse est une simplification extrême de l'ensemble du processus. Je recommande de lire le code pour Dialect.java et, par exemple, MySQLDialect.java. De cette façon, vous pouvez avoir une idée sur la façon dont les structures Hibernate (et même comment il consomme) certaines de ces informations:

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/MySQLDialect.java

3

Si nous parlent des dialectes dans Hibernate une requête dans la mise en veille prolongée sera être converti en requête spécifique à la base de données, quel que soit le type de base de données. Et Hibernate supporte les requêtes HQL, en interne ces requêtes HQL seront converties en appels SQL de base de données natifs.