Подтвердить что ты не робот

Зачем мне нужно настроить диалект SQL источника данных?

Когда мы настраиваем источник данных с помощью Hibernate, мы должны добавить свойство hibernate.dialect (или eclipselink.target-database, если вы используете EclipseLink).

Я хочу знать, что означает диалект? Я настраиваю это свойство в соответствии с документацией Hibernate, но я не знаю, что это значит.

4b9b3361

Ответ 1

Диалект означает "вариант языка". Спящий режим, как известно, является агностиком базы данных. Он может работать с различными базами данных. Тем не менее, базы данных имеют собственные расширения/собственные варианты SQL и устанавливают/подмножество стандартных реализаций SQL. Поэтому в какой-то момент hibernate должен использовать SQL базы данных. Hibernate использует конфигурацию "диалект", чтобы узнать, какую базу данных вы используете, чтобы она могла переключиться на код генератора SQL-кода, где бы это ни было необходимо.

Ответ 2

Короткий ответ

"Ирония JDBC заключается в том, что, хотя интерфейсы программирования портативный, язык SQL - нет. Несмотря на многочисленные попытки стандартизировать его, все же редко приходится писать SQL любой сложности, что будет работать без изменений на двух основных платформах баз данных. Даже там, где SQL диалекты схожи, каждая база данных работает по-разному в зависимости от структура запроса, требующая настройки конкретного поставщика в в большинстве случаев."

.. украден из Pro JPA 2 Освоение API Java Persistence, глава 1, стр. 9

Итак, мы можем подумать о JDBC как о последней спецификации, которая абстрагирует все, что связано с базами данных, но это не так.

Цитата из спецификации JDBC, глава 4.4, стр. 20:

Уровень драйвера может маскировать различия между стандартным синтаксисом SQL: 2003 и нативный диалект, поддерживаемый источником данных.

Май не гарантирует, что водитель будет, и поэтому мы должны предоставить диалект, чтобы иметь рабочее приложение. В лучшем случае приложение будет работать, но может работать не так эффективно, как только может, если провайдер настойчивости знал, какой диалект использовать. В случае Hibernate он откажется от развертывания вашей заявки, если вы не подадите ему диалект.

Как насчет JPQL?

В спецификации JDBC не упоминается слово JPQL. JDBC является стандартным способом доступа к базе данных. Прочитайте этот JavaDoc, и вы обнаружите, что, как только приложение может получить доступ к базе данных, то, что должно быть подано в драйвер JDBC-совместимого, является vanilla = undecorated SQL.

Стоит отметить, что JPQL - это язык запросов, а не язык определения данных (DDL). Поэтому, даже если мы могли бы подключить JDBC-драйвер к JPQL, это было бы бесполезно для провайдера персистентности на этапе анализа файла persistence.xml и настройки таблиц.

Более внимательный взгляд на свойство

Для справки, приведен пример Hibernate и EclipseLink о том, как указать диалоги Java DB в файле persistence.xml:

<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyTenSevenDialect"/>
<property name="eclipselink.target-database" value="JavaDB"/>

Обязательно ли это свойство?

В теории свойство не было стандартизировано, а JPA 2.1 спецификация не говорит ни слова о диалектах SQL. Поэтому нам не повезло и нужно обратиться к конкретным эмпирическим исследованиям и документации этого поставщика.

Hibernate отказывают в принятии архива развертывания, который не указал свойства, предоставляя архив неиспользуемым. Документация Hibernate говорит:

Всегда устанавливайте свойство hibernate.dialect на правильное org.hibernate.dialect.Dialect для вашей базы данных.

Так что это довольно ясно. Обратите внимание, что диалекты, перечисленные в документации, специально предназначены для одного или другого поставщика. Нет "общего" диалекта или чего-то подобного. Учитывая, что свойство является абсолютным требованием для успешного развертывания, вы ожидаете, что документация сервера приложений WildFly, которая связывает Hibernate, должна что-то сказать, но это не так, т.

EclipseLink, с другой стороны, немного более прощает. Если вы не предоставите свойство, развертывание развертывается (без предупреждения). Документация EclipseLink говорит:

Используйте свойство eclipselink.target-database для указания базы данных для использования, управления пользовательскими операциями и генерации SQL для указанной базы данных.

Говоря о "пользовательских операциях и генерации SQL", это означает, что это немного расплывчато, если вы спросите меня. Но ясно одно: они не говорят, что собственность является обязательной. Также обратите внимание, что одним из доступных значений является "База данных", которая представляет собой цель "общей базы данных". Хмм, что такое "диалект"? SQL 2.0?? Но опять же, свойство называется "целевая база данных", а не "диалект", поэтому, возможно, "база данных" переводится без SQL вообще. Переход на сервер GlassFish, который объединяет EclipseLink. Документация (страница "6-3" ) гласит:

Вы можете указать дополнительное свойство eclipselink.target-database для убедитесь, что тип базы данных верен.

Итак, GlassFish утверждает, что свойство "необязательно", и добавленная стоимость является "гарантией", что я фактически использую Java DB - в случае, если я не знал.

Заключение

Скопируйте все, что вы можете найти в Google, и молитесь Богу.

Ответ 3

Hibernate.dialect свойство сообщает Hibernate генерировать соответствующие операторы SQL для выбранной базы данных.

Список доступных диалектов можно найти здесь: 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

Ответ 4

Диалект - это диалоги SQL, которые использует ваша база данных.

Список диалектов SQL для Hibernate.

Либо укажите hibernate.cfg.xml как:

<hibernate-configuration>
   <session-factory name="session-factory">
      <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
       ...
   </session-factory>
</hibernate-configuration>

или в файле свойств:

hibernate.dialect=org.hibernate.dialect.SQLServerDialect

Ответ 5

Короткий ответ

hibernate.dialect свойство позволяет Hibernate генерировать соответствующие операторы SQL для выбранной базы данных.

Ответ 6

Базы данных реализуют тонкие различия в SQL, которые они используют. Например, такие типы данных, как типы данных, различаются по базам данных (например, в Oracle. Вы можете поместить целочисленное значение в поле чисел, а в SQL Server - поле int). Или конкретная функциональность базы данных - выбор первых n строк различается в зависимости от базы данных. Диалект аннотирует это, поэтому вам не нужно беспокоиться об этом.

Ответ 7

Диалект SQL преобразует запрос HQL, который мы пишем в нашей java или любой другой объектно-ориентированной программе в конкретную базу данных SQL.

Например, в java предположим, что я пишу List employees = session.createQuery( "FROM Employee" ). List();

но когда мой диалект <property name="hibernate.dialect">    org.hibernate.dialect.MySQLDialect

HQL ( "FROM Employee" ) преобразуется в "SELECT * FROM EMPLOYEE" перед удалением базы данных MySQL

Ответ 8

Диалект в контексте Hibernate будет заботиться о типе данных базы данных, например, в orace он является целым числом, но в SQL он является int, поэтому это будет известно из hibernate этим свойством, как отображать поля внутри.

Ответ 9

Hibernate использует конфигурацию "dialect", чтобы узнать, какую базу данных вы используете, чтобы она могла конвертировать запрос на спящий режим в запрос конкретной базы данных.

Ответ 10

Свойство Dialect используется в спящем режиме следующими способами.

  • Чтобы создать оптимизированные SQL-запросы.
  • Если у вас есть несколько БД, тогда вам нужно поговорить с конкретным БД.
  • Чтобы установить значения по умолчанию для свойств файла конфигурации гибернации на основе программного обеспечения БД, которое мы используем, даже если они не указаны в файле конфигурации.

Ответ 11

Диалог - это форма языка, на котором говорит определенная группа людей.

Здесь, в контексте спящего режима, когда hibernate хочет разговаривать (используя запросы) с базой данных, он использует диалекты.

Диалоговое окно SQL выводится из языка структурированных запросов, который использует человекочитаемые выражения для определения запросов запроса.
Диалог спящего режима предоставляет информацию о том, как конвертировать hibernate-запросы (HQL) в собственные SQL-запросы.

Диалог спящего режима можно настроить с помощью свойства ниже:

hibernate.dialect

Здесь, это полный список диалектов спящего режима.

Примечание. Свойство диалекта спящего режима не.