2010-12-16 9 views
6

Hibernate jest niezależny od bazy danych. Tak więc, niezależnie od bazy danych, którą będziemy używać w naszej aplikacji, musimy ustawić dialekt związanych z tą bazą danych.Dialekt w hibernacji

Dla przykładu załóżmy, że używamy bazy danych MySQL, to musimy poniżej dialekcie: org.hibernate.dialect.MySQLDialect

Załóżmy używamy bazy danych SQL Server, to musimy poniżej dialekcie: org.hibernate .dialect.SQLServerDialect

Hibernacja wygeneruje odpowiednie zapytanie związane z tą bazą danych. Moje pytanie brzmi: Który mechanizm używany przez hibernację do generowania zapytania na podstawie bazy danych?

Odpowiedz

9

Nie wiesz, zrozumiałem pytanie, ale spróbuję :-)

pierwsze, pewne rzeczy, które działa we wszystkich bazach danych, podczas gdy inne rzeczy są specyficzne dla niektórych baz danych (takich jak „co aktualna data i godzina? "). W przypadku rzeczy, które działają we wszystkich bazach danych, nie ma niczego konkretnego dla dialektów.

Jednak dla wszystkich części, które mogą się różnić od bazy danych w innej, Hibernate używa dialektu. Dialect jest "pomocnikiem" dla Hibernate do komunikowania się z bazą danych w swoim języku. Na przykład w pewnym momencie kod hibernacji musi wiedzieć, jaki jest typ danych bazy danych dla typu JDBC "Types.TIMESTAMP". "Rdzeniowy" kod Hibernate mówi po prostu "daj mi cokolwiek jest tym odpowiednikiem db z Types.TIMESTAMP", a konkretny dialekt odpowiada na to.

To samo dzieje się w przypadku generowania kodu SQL (lub generowania zapytań, zgodnie z zapytaniem). Hibernate zna podstawową strukturę, ale zapewnia również pewne przechwyty w dialekcie, dzięki czemu określony dialekt może powiedzieć "Nie obsługuję funkcji X" lub "dla funkcji Y, użyj ciągu" abc "w zapytaniu".

Oczywiście, moja odpowiedź jest ekstremalnym uproszczeniem całego procesu. Zalecam przeczytanie kodu dla Dialect.java i na przykład MySQLDialect.java. W ten sposób można mieć wyobrażenie o konstrukcji jak Hibernate (a nawet jak to zużywa) niektóre z tych informacji:

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

jeśli używamy dialekty w Hibernate każde zapytanie w Hibernate zostać przekonwertowane na zapytanie specyficzne dla bazy danych, niezależnie od typu bazy danych. I Hibernate obsługuje kwerendy HQL, wewnętrznie te kwerendy HQL będą konwertowane na macierzyste wywołania SQL bazy danych.

Powiązane problemy