¿Por qué necesito configurar el dialecto SQL de una fuente de datos?


Cuando configuramos una fuente de datos usando Hibernate, debemos agregar la propiedad hibernate.dialect (o eclipselink.target-database si está usando EclipseLink).

Quiero saber ¿cuál es el significado de dialecto? Configuro esta propiedad de acuerdo con la documentación de Hibernate pero no se cual es el significado de la misma.

Author: Brian Drummond, 2014-01-09

11 answers

Dialecto significa "la variante de una lengua". Hibernar, como sabemos, es agnóstico de la base de datos. Puede funcionar con diferentes bases de datos. Sin embargo, las bases de datos tienen extensiones propietarias/variaciones SQL nativas, y conjunto/subconjunto de implementaciones estándar SQL. Por lo tanto, en algún momento hibernate tiene que usar SQL específico de la base de datos. Hibernate utiliza la configuración de "dialecto" para saber qué base de datos está utilizando para que pueda cambiar al código específico del generador SQL de la base de datos donde sea/cuando sea necesario.

 78
Author: RaviH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-09 06:17:15

Respuesta corta

" La ironía de JDBC es que, aunque las interfaces de programación son portable, el lenguaje SQL no lo es. A pesar de los muchos intentos de estandarizar, es raro escribir SQL de cualquier complejidad que se ejecutará sin cambios en dos plataformas de bases de datos principales. Incluso donde el SQL los dialectos son similares, cada base de datos funciona de manera diferente dependiendo de la estructura de la consulta, que requiere un ajuste específico del proveedor la mayoría de los casos."

..robado de Pro JPA 2 Dominar la Java Persistence API , capítulo 1, página 9

Entonces, podríamos pensar en JDBC como la especificación definitiva que abstrae todo lo relacionado con las bases de datos, pero no lo es.

Una cita de la especificación JDBC , capítulo 4.4, página 20:

La capa del controlador puede enmascarar las diferencias entre la sintaxis estándar de SQL: 2003 y el dialecto nativo soportado por los datos fuente.

May no garantiza que el controlador lo hará, y por lo tanto debemos proporcionar el dialecto para tener una aplicación que funcione. En el mejor de los casos, la aplicación funcionará, pero podría no ejecutarse tan eficazmente como podría si el proveedor de persistencia supiera qué dialecto usar. En el caso de Hibernación, se negará a implementar su aplicación a menos que le proporcione el dialecto.

¿Qué pasa con JPQL entonces?

El JDBC la especificación no menciona la palabra JPQL. JDBC es una forma estandarizada de acceso a la base de datos . Vaya a leer este JavaDoc y encontrará que una vez que la aplicación puede acceder a la base de datos, lo que debe ser introducido en el controlador compatible con JDBC es vanilla = undecorated SQL.

Vale la pena señalar que JPQL es un lenguaje de consulta, no un lenguaje de definición de datos (DDL). Así que incluso si pudiéramos alimentar el controlador JDBC con JPQL, eso no sería de utilidad para la persistencia proveedor durante la fase de análisis del archivo persistence.xml y la creación de tablas.

Una mirada más cercana a la propiedad

Para su referencia, aquí hay un ejemplo para Hibernar y EclipseLink sobre cómo especificar un dialecto de Java DB en la persistencia.archivo xml:

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

¿Es obligatoria la propiedad?

En teoría, la propiedad no ha sido estandarizada y la especificación JPA 2.1 no dice ni una palabra sobre los dialectos SQL. Así que no tenemos suerte y debemos recurrir a proveedores específicos estudios empíricos y documentación de los mismos.

Hibernate se niega a aceptar un archivo de implementación que no ha especificado la propiedad que hace que el archivo no se pueda desplegar. La documentación de hibernación dice:

Establece siempre la hibernación.propiedad dialectal a la correcta org.hibernación.dialectal.Subclase dialectal para su base de datos.

Así que eso está bastante claro. Tenga en cuenta que los dialectos enumerados en la documentación están dirigidos específicamente a uno o el otro vendedor. No hay dialecto "genérico" ni nada por el estilo. Dado que la propiedad es un requisito absoluto para una implementación exitosa, esperaría que la documentación del servidor de aplicaciones WildFly que empaqueta Hibernate diga algo, pero no lo hace.

EclipseLink por otro lado es un poco más indulgente. Si no proporciona la propiedad, la implementación se implementa (también sin previo aviso). EclipseLink la documentación dice:

Usa el eclipselink.target-database propiedad para especificar la base de datos para usar, controlando operaciones personalizadas y generación SQL para el base de datos especificada.

La charla es sobre "operaciones personalizadas y generación SQL", lo que significa que es un poco vaga si me preguntas. Pero una cosa está clara: No dicen que la propiedad es obligatoria. También tenga en cuenta que uno de los valores disponibles es "Base de datos" que representan "una base de datos genérica" destino. Hmm, ¿qué "dialecto"sería? SQL 2.0?? Pero, de nuevo, la propiedad se llama "target-database" y no "dialect", por lo que tal vez "Database" se traduce en ningún SQL en absoluto lol. Pasando al servidor GlassFish que agrupa EclipseLink. La documentación (página "6-3") dice:

Puede especificar el eclipselink opcional.target-propiedad de base de datos a garantizar que el tipo de base de datos es correcto.

Así que GlassFish argumenta que la propiedad es "opcional" y el valor añadido es una "garantía" de que realmente estoy usando Java DB, en caso de que no lo supiera.

Conclusión

Copie y pegue todo lo que pueda encontrar en Google y ore a Dios.

 29
Author: Martin Andersson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-26 09:24:27

Hibernate.dialect property le dice a Hibernate que genere las instrucciones SQL apropiadas para la base de datos elegida.

Una lista de dialectos disponibles se puede encontrar aquí: 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
 14
Author: Mani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-18 08:11:04

Respuesta corta

hibernate.dialect la propiedad hace Hibernación para generar las instrucciones SQL apropiadas para la base de datos elegida.

 5
Author: Sri Harsha Kappala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-09 06:34:09

Dialecto es el dialecto SQL que utiliza su base de datos.

Lista de dialectos SQL para Hibernar.

O bien proporcionarlo en hibernación.cfg.xml as:

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

O en el archivo de propiedades como:

hibernate.dialect=org.hibernate.dialect.SQLServerDialect
 5
Author: K.C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-09 06:35:17

Hibernate utiliza la configuración de "dialecto" para saber qué base de datos está utilizando para que pueda convertir la consulta de hibernate en una consulta específica de la base de datos.

 3
Author: vishal thakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-01 16:28:54

Las bases de datos implementan diferencias sutiles en el SQL que utilizan. Cosas como los tipos de datos, por ejemplo, varían entre las bases de datos (por ejemplo, en Oracle Puede poner un valor entero en un campo numérico y en SQL Server usar un campo int). O funcionalidad específica de la base de datos: seleccionar las n filas superiores es diferente dependiendo de la base de datos. El dialecto abstrae esto para que no tenga que preocuparse por ello.

 2
Author: Pradeep Kr Kaushal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-09 06:49:11

El dialecto SQL convierte la consulta HQL que escribimos en nuestro java o cualquier otro programa orientado a objetos a la base de datos SQL específica.

Por ejemplo, en java supongamos que escribo Lista empleados = sesión.createQuery ("DE empleado").list ();

Pero cuando mi dialecto es <property name="hibernate.dialect"> org.hibernación.dialectal.MySQLDialect

El HQL ("FROM Employee") se convierte en" SELECT * FROM EMPLOYEE " antes de golpear la base de datos MySQL

 2
Author: Sarita,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-10 15:14:15

El dialecto en el contexto de Hibernación, se encargará del tipo de datos de la base de datos, como en orace es entero sin embargo en SQL es int, por lo que esto se conocerá en hibernación por esta propiedad, cómo mapear los campos internamente.

 2
Author: Usman Zafar Malik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-29 09:54:24

La propiedad dialectal es utilizada por hibernate de las siguientes maneras

  1. Para generar consultas SQL optimizadas.
  2. Si tiene más de una BD, hable con la BD en particular que desee.
  3. Para establecer valores predeterminados para las propiedades del archivo de configuración de hibernación basadas en el software de la base de datos que usamos, aunque no estén especificadas en el archivo de configuración.
 0
Author: Praveen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 06:35:08

Un dialecto es una forma de la lengua que es hablada por un grupo particular de personas.

Aquí, en el contexto del framework hibernate, Cuando hibernate quiere hablar (usando consultas) con la base de datos, utiliza dialectos.

Los dialectos SQL se derivan del Lenguaje de Consulta Estructurado que utiliza expresiones legibles por humanos para definir sentencias de consulta.
A dialecto de hibernación da información al marco de cómo convertir hibernar consultas (HQL) en consultas SQL nativas.

El dialecto de hibernación se puede configurar usando la siguiente propiedad:

hibernate.dialect

Aquí, es una lista completa de hibernación dialectos.

Nota: La propiedad dialectal de hibernate es no obligatoria.

 0
Author: Rohit Gaikwad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-21 05:36:28