Зачем мне нужно настроить диалект SQL источника данных?
Когда мы настраиваем источник данных, используя Hibernate, мы должны добавить hibernate.dialect
собственность (или eclipselink.target-database
если вы используете EclipseLink).
Я хочу знать, что означает диалект? Я настраиваю это свойство в соответствии с документацией Hibernate, но я не знаю, что это значит.
11 ответов
Диалект означает "вариант языка". Hibernate, как мы знаем, не зависит от базы данных. Может работать с разными базами данных. Однако базы данных имеют собственные расширения / собственные варианты SQL и набор / поднабор стандартных реализаций SQL. Поэтому в какой-то момент hibernate должен использовать специфический для базы данных SQL. Hibernate использует конфигурацию "диалект", чтобы знать, какую базу данных вы используете, чтобы он мог переключаться на специфический для базы данных генератор кода SQL, где и когда бы это ни было необходимо.
Короткий ответ
"Ирония в JDBC заключается в том, что, хотя интерфейсы программирования являются переносимыми, язык SQL - нет. Несмотря на многочисленные попытки его стандартизации, по-прежнему редко пишется SQL любой сложности, который будет работать без изменений на двух основных платформах баз данных. Даже где диалекты SQL схожи, каждая база данных работает по-разному в зависимости от структуры запроса, что в большинстве случаев требует настройки конкретного поставщика ".
.. Stolen от Pro JPA 2 Освоение API персистентности Java, глава 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?? Но опять же, свойство называется "target-database", а не "dialect", так что, возможно, "Database" вообще не переводится в SQL, lol. Переходим к серверу GlassFish, который объединяет EclipseLink. Документация (страница "6-3") гласит:
Вы можете указать необязательное свойство eclipselink.target-database, чтобы гарантировать, что тип базы данных правильный.
Так 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
Диалект - это диалект 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
Короткий ответ
hibernate.dialect
Свойство Hibernate позволяет генерировать соответствующие операторы SQL для выбранной базы данных.
Hibernate использует конфигурацию "диалект", чтобы узнать, какую базу данных вы используете, чтобы преобразовать запрос Hibernate в запрос к базе данных.
Диалект SQL преобразует HQL-запрос, который мы пишем в нашей Java или любой другой объектно-ориентированной программе, в конкретную базу данных SQL.
Например, в java предположим, что я пишу список employee = session.createQuery("FROM Employee"). List();
но когда мой диалект<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
HQL ("FROM Employee") преобразуется в "SELECT * FROM EMPLOYEE" перед попаданием в базу данных MySQL.
Диалект в контексте Hibernate позаботится о типе данных базы данных, как в orace, он целочисленный, однако в SQL это int, так что это свойство будет известно в hibernate, как отобразить поля внутри.
Базы данных реализуют тонкие различия в SQL
они используют. Такие вещи, как типы данных, например, различаются в разных базах данных (например, в Oracle Вы можете поместить целочисленное значение в числовое поле, а в SQL Server использовать поле int). Или специфическая функциональность базы данных - выбор первых n строк различается в зависимости от базы данных. Диалект абстрагирует это, так что вам не нужно об этом беспокоиться.
Диалект - это форма языка, на котором говорит определенная группа людей.
Здесь, в контексте фреймворка hibernate, когда hibernate хочет общаться(используя запросы) с базой данных, он использует диалекты.
Диалекты SQL являются производными от языка структурированных запросов, который использует понятные человеку выражения для определения операторов запроса.
Диалект гибернации дает информацию о том, как конвертировать запросы гибернации (HQL) в собственные запросы SQL.
Диалект hibernate может быть настроен с помощью свойства ниже:
hibernate.dialect
Вот полный список спящих диалектов.
Примечание: свойство диалекта hibernate не является обязательным.
Свойство Dialect используется hibernate следующими способами
- Для генерации оптимизированных SQL-запросов.
- Если у вас есть более одной БД, то поговорить с конкретной БД, которую вы хотите.
- Чтобы установить значения по умолчанию для свойств файла конфигурации Hibernate на основе программного обеспечения БД, которое мы используем, даже если они не указаны в файле конфигурации.