DB 별로 제공하는 SQL 문법 과 기능은 차이가 있다.
방언(Dialect) -> SQL 표준을 지키지 않는 특정 DB만의 고유한 기능
JPA는 특정 데이터베이스에 종속되지 않는다. -> Dialect를 통해 지정한 DB의 SQL 생성
이는 hibernate.dialect 속성에서 지정할 수 있다.
• H2 : org.hibernate.dialect.H2Dialect
• Oracle 19c : org.hibernate.dialect.Oracle12cDialect
• MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
-> 같은 DB 일지라도 버전에 따라 Dialect가 다르니 주의가 필요.
JPA Dialect Architecture
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성, 연결 정보 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<!-- JPA SQL 표현 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<!-- format 보기 쉽도록 -->
<property name="hibernate.format_sql" value="true"/>
<!-- SQL 주석 표현 옵션 -->
<property name="hibernate.use_sql_comments" value="true"/>
</properties>
</persistence-unit>
</persistence>
// 사용 예시
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
// transaction start
tx.begin();
try {
// select
Member findMemeber = em.find(Member.class, 1L);
// JPQL select
List<Member> result = em.createQuery("SELECT m from Member as m", Member.class)
.getResultList();
// update
findMember.setName("HelloJpa");
// insert
Member m2 = new Member();
m2.setId(2L);
m2.setName("Member2");
em.persist(m2);
tx.commit();
} catch (Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
}