2010-12-16 8 views
6

Hibernate ist datenbankunabhängig. Also, egal welche Datenbank wir in unserer Anwendung verwenden, müssen wir Dialekt in Bezug auf diese Datenbank setzen.Dialekt in Hibernate

Beispiel: Angenommen, wir MySQL-Datenbank verwenden, dann müssen wir unter Dialekt: org.hibernate.dialect.MySQLDialect

Angenommen, wir SQL Server-Datenbank verwenden, dann müssen wir unter Dialekt: org.hibernate .dialect.SQLServerDialect

Hibernate generiert die entsprechende Abfrage für diese Datenbank. Meine Frage ist, welcher Mechanismus von Hibernate verwendet wird, Abfrage basierend auf Datenbank zu generieren?

Antwort

9

nicht sicher, ob ich Ihre Frage verstanden, aber ich werde versuchen :-)

Erstens gibt sind einige Dinge, die in allen Datenbanken arbeitet, während andere Dinge, die für einige Datenbanken sind (wie „was ist das aktuelle Datum und die Uhrzeit? "). Für Dinge, die in allen Datenbanken funktionieren, gibt es nichts wirklich Spezifisches für die Dialekte.

Aber für alle Teile, die sich von einer Datenbank zu einer anderen unterscheiden können, verwendet Hibernate den Dialekt. Dialekt ist ein "Helfer" für Hibernate, um mit der Datenbank in seiner Sprache zu kommunizieren. Zum Beispiel muss ein Hibernate-Code irgendwann wissen, welcher Datentyp der Datenbank für den JDBC-Typ "Types.TIMESTAMP" ist. Der "Kern" -Code von Hibernate sagt nur: "Gib mir, was auch immer das ist, was dieser Database entspricht. TIMESTAMP", und der spezifische Dialekt antwortet darauf.

Das gleiche passiert für die SQL-Generierung (oder Abfrage-Generierung, wie Sie gefragt). Hibernate kennt die grundlegende Struktur, bietet aber auch einige Hooks im Dialekt, so dass ein bestimmter Dialekt sagen kann: "Ich unterstütze kein Feature X" oder "verwende für Feature Y die Zeichenfolge 'abc' in der Abfrage".

Natürlich ist meine Antwort eine extreme Vereinfachung des gesamten Prozesses. Ich empfehle, den Code für Dialekt.java und zum Beispiel MySQLDialect.java zu lesen. Auf diese Weise können Sie eine Idee, wie Hibernate Strukturen haben (und sogar, wie es verbraucht) einige dieser Informationen:

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

Wenn wir verwenden Dialects in Hibernate jede Abfrage in der Hibernate wird unabhängig vom Typ der Datenbank in eine datenbankspezifische Abfrage konvertiert werden. Und Hibernate unterstützt HQL-Abfragen, intern werden diese HQL-Abfragen in native Datenbank-SQL-Aufrufe konvertiert.

Verwandte Themen