programing

데이터 소스의 SQL 언어를 구성해야하는 이유는 무엇입니까?

luckcodes 2021. 1. 16. 20:29

데이터 소스의 SQL 언어를 구성해야하는 이유는 무엇입니까?


Hibernate를 사용하여 데이터 소스를 구성 할 때 hibernate.dialect속성을 추가해야 합니다 (또는 eclipselink.target-databaseEclipseLink를 사용하는 경우).

방언 의 의미가 무엇인지 알고 싶습니다 . Hibernate의 문서에 따라이 속성을 구성했지만 그 의미가 무엇인지 모르겠습니다.


방언은 "언어의 변형"을 의미합니다. 우리가 알고 있듯이 Hibernate는 데이터베이스에 구애받지 않습니다. 다른 데이터베이스에서 작동 할 수 있습니다. 그러나 데이터베이스에는 독점 확장 / 네이티브 SQL 변형 및 SQL 표준 구현의 집합 / 하위 집합이 있습니다. 따라서 어떤 시점에서 최대 절전 모드는 데이터베이스 특정 SQL을 사용해야합니다. Hibernate는 "dialect"구성을 사용하여 어떤 데이터베이스를 사용 중인지 알 수 있으므로 필요할 때마다 데이터베이스 특정 SQL 생성기 코드로 전환 할 수 있습니다.


짧은 대답

"JDBC의 아이러니는 프로그래밍 인터페이스는 이식 가능하지만 SQL 언어는 그렇지 않다는 것입니다. 표준화하려는 많은 시도에도 불구하고 두 개의 주요 데이터베이스 플랫폼에서 변경되지 않고 실행되는 복잡한 SQL을 작성하는 것은 여전히 ​​드뭅니다. SQL 언어가 유사한 경우 각 데이터베이스는 쿼리 구조에 따라 다르게 수행되므로 대부분의 경우 공급 업체별 튜닝이 필요합니다. "

..Pro JPA 2 에서 도난 Java Persistence API 마스터 링 , 1 장, 9 페이지

따라서 JDBC를 데이터베이스와 관련된 모든 것을 추상화하는 궁극적 인 사양으로 생각할 수 있지만 그렇지 않습니다.

JDBC 사양 의 인용문 , 장 4.4, 페이지 20 :

드라이버 계층 표준 SQL : 2003 구문과 데이터 소스에서 지원하는 기본 언어 간의 차이를 숨길 수 있습니다 .

5 월 은 운전자 가하겠다는 보장이 없으므로 작동하는 응용 프로그램을 갖기 위해 방언을 제공해야합니다. 최상의 시나리오에서 응용 프로그램은 작동하지만 지속성 공급자가 사용할 언어를 알고있는 경우만큼 효과적으로 실행되지 않을 수 있습니다. Hibernate의 경우, 당신이 그에게 방언을 제공하지 않는 한 그는 당신의 애플리케이션 배포를 거부 할 것입니다.

그러면 JPQL 은 어떻습니까?

JDBC 사양에는 JPQL이라는 단어가 언급되어 있지 않습니다. JDBC는 데이터베이스 액세스 의 표준화 된 방법입니다 . 이 JavaDoc을 읽으면 애플리케이션이 데이터베이스에 액세스 할 수있게되면 JDBC 호환 드라이버에 공급해야하는 것은 vanilla = undecorated SQL이라는 것을 알 수 있습니다.

JPQL은 데이터 정의 언어 (DDL)가 아니라 쿼리 언어라는 점은 주목할 가치가 있습니다. 따라서 JDBC 드라이버에 JPQL을 제공 할 수 있더라도 persistence.xml파일 을 구문 분석하고 테이블을 설정 하는 단계에서 지속성 공급자에게는 쓸모가 없습니다 .

속성 자세히 살펴보기

참고로 persistence.xml 파일에서 Java DB 언어를 지정하는 방법에 대한 Hibernate 및 EclipseLink의 예가 있습니다.

<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 하위 클래스로 설정하십시오.

그래서 그것은 매우 분명합니다. 설명서에 나열된 방언은 특히 하나 또는 다른 공급 업체를 대상으로합니다. "일반적인"방언이나 이와 유사한 것은 없습니다. 이 속성이 성공적인 배포를위한 절대적인 요구 사항이라는 점을 감안할 때 Hibernate를 번들로 제공하는 WildFly 응용 프로그램 서버 문서 에 무언가를 말해야한다고 예상 할 수 있지만 그렇지 않습니다.

반면 EclipseLink 는 조금 더 관대합니다. 속성을 제공하지 않으면 배포가 배포됩니다 (경고도 없음). EclipseLink 문서에 따르면 다음과 같습니다.

eclipselink.target-database 특성을 사용하여 사용할 데이터베이스를 지정하고 지정된 데이터베이스에 대한 사용자 정의 조작 및 SQL 생성을 제어하십시오.

이야기는 "사용자 지정 작업 및 SQL 생성"에 대한 것이므로 저에게 물어 보면 약간 모호합니다. 그러나 한 가지는 분명합니다. 그들은 재산이 의무적이라고 말하지 않습니다. 또한 사용 가능한 값 중 하나는 "일반 데이터베이스"대상을 나타내는 "데이터베이스"입니다. 흠, 그게 무슨 "방언"일까요? SQL 2.0 ?? 그러나 다시 말하지만, 속성은 "dialect"가 아니라 "target-database"라고 불리므로 "Database"는 SQL이 전혀없는 것으로 해석 될 수 있습니다. EclipseLink를 번들로 제공하는 GlassFish 서버로 이동합니다. 문서 ( "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

짧은 대답

hibernate.dialect 속성은 Hibernate가 선택된 데이터베이스에 대한 적절한 SQL 문을 생성하도록합니다.


Dialect는 데이터베이스에서 사용 하는 SQL 언어 입니다.

Hibernate를위한 SQL 언어 목록 .

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 uses "dialect" configuration to know which database you are using so that it can convert hibernate query to database specific query.


Databases implement subtle differences in the SQL they use. Things such as data types for example vary across databases (e.g. in Oracle You might put an integer value in a number field and in SQL Server use an int field). Or database specific functionality - selecting the top n rows is different depending on the database. The dialect abstracts this so you don't have to worry about it.


The SQL dialect converts the HQL query which we write in our java or any other object oriented program to the specific database SQL.

For example in the java suppose I write List employees = session.createQuery("FROM Employee").list();

but when my dialect is <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect

The HQL ("FROM Employee") gets converted to "SELECT * FROM EMPLOYEE" before hitting the MySQL database


The dialect in the Hibernate context, will take care of database data type, like in orace it is integer however in SQL it is int, so this will by known in hibernate by this property, how to map the fields internally.


A dialect is a form of the language that is spoken by a particular group of people.

Here, in context of hibernate framework, When hibernate wants to talk(using queries) with the database it uses dialects.

The SQL dialect's are derived from the Structured Query Language which uses human-readable expressions to define query statements.
A hibernate dialect gives information to the framework of how to convert hibernate queries(HQL) into native SQL queries.

The dialect of hibernate can be configured using below property:

hibernate.dialect

Here, is a complete list of hibernate dialects.

Note: The dialect property of hibernate is not mandatory.


Dialect property is used by hibernate in following ways

  1. To generate Optimized SQL queries.
  2. If you have more than one DB then to talk with particular DB you want.
  3. To set default values for hibernate configuration file properties based on the DB software we use even though they are not specifed in configuration file.

ReferenceURL : https://stackoverflow.com/questions/21012799/why-do-i-need-to-configure-the-sql-dialect-of-a-data-source