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

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

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

11 ответов


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


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

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

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

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

цитата спецификация JDBC, глава 4.4, Страница 20:

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

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

насчет JPQL тогда?

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

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

более близкий взгляд на свойство

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

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

является ли свойство обязательным?

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

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

Всегда устанавливайте спящий режим.свойство dialect для правильного орг.зимовать.диалект.Подкласс диалекта для вашей базы данных.

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

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

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

разговор идет о " пользовательских операциях и SQL поколение", что означает, что это немного расплывчато, если вы спросите меня. Но ясно одно: они не говорят, что собственность является обязательной. Также обратите внимание, что одним из доступных значений является "база данных", которая представляет собой цель "универсальная база данных". Что это за" диалект"? В SQL 2.0?? Но опять же, свойство называется "target-database", а не" dialect", поэтому, возможно," Database " переводится без SQL вообще lol. Переходим к серверу GlassFish, который связывает EclipseLink. документация (стр. "6-3") говорит:

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

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

вывод

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


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

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

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


диалект является SQL-диалект что ваша база данных использует.

список диалектов SQL для спящего режима.

либо предоставить его в спящий режим.контекстно-свободная грамматика.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

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


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


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

например, в java предположим, что я пишу Список сотрудников = сеанс.createQuery("у сотрудника").list();

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

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


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


свойство диалекта используется hibernate следующими способами

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

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

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

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

диалект hibernate можно настроить, используя следующее свойство:

hibernate.dialect

здесь, полный список диалектов гибернации.

Примечание: свойство диалекта hibernate является не обязательным.