Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Tip

JPA의 컨셉은 Java Persistence API 의 약자로 두가지 큰 목적을 가지고 있습니다.

  • 데이터 베이스에 존재하는
모델을
  • 모델링을 자바객체로
DB종속적이지 않게 맵핑을 가능하게 하는데 목적이 있습니다.
  • 맵핑을 시킴
  • SP/SQL방식을 최대한 억제하고, OOP적 접근을 통해 데이터 검색및 제어

JPA와 별개로 데이터베이스를 잘 활용하는 방법은 데이터베이스를 잘 이해하는것임으로

연관부분이 있을시 JPA의 특성과 같이 설명 진행

이 페이지에서는 JPA의 대략적인 사용법과 특징을 설명하겠습니다.

이러한게 있다라고 알고 대충 넘어가도 되겠습니다.

JPA와 별개로 RDB를 잘 활용하는 방법은 RDB를 잘 이해하는것임으로

JPA의 특성과 같이 다시 상세하게 설명할 예정입니다.


설명을 위해, 축약된 코드로 설명을 하였으며진행되며, 풀소스는 아래에서 확인가능합니다.

CodeLink : http://git.webnori.com/projects/WEBF/repos/spring_jpa/browse

JPA 개념 추가설명

...

  • update: JPA에서 정의한 데이터모델과,  데이터베이스의 스키마 변경이 있을때 반영됩니다. 

  • create: 어플리케이션 구동시 drop+create 를 수행

  • create-drop: 어플리케이션 구동시 drop+create를 수행하고 종료시 drop수행

  • validate : 테이블과 엔티티매핑정보가 맞지않으면 어플리케이션 실행하지 않음어플리케이션 실행하지 않음

DDL(Data Definitison Language)의 테이블 객체의 생성(Create),변경(Alert),삭제(Drop)등을

수행하는 명령문이라고 보시면됩니다. JPA에서는 옵션이라고 단순하게 설명을 하였지만

개발 프로토타잎/반영 자동화등에 활용될수 있으나 어플리케이션에서 DDL을 정책없이

모두 허용하는것은 위험합니다.

데이터베이스를 개발,유지,운영하는 정책/권한/전략과 상관이 있는 중요한 옵션입니다.

네이밍룰

...


JPA에서 class를 통해 테이블을 정의할때 몇가지 규칙이 있습니다.

...

항목DBJPA객체설명
Table(Class)sample_tableSampleTable헝가리 표기법을따름
Field(member)sample_namesampleName카멜표기법을 따름




db에따라 기본 네이밍룰은 약간의 차이가 있을수도 있습니다.

OS에따라 필드명 대소문자가 구분될수도 있기때문에,

JPA를 사용한다면 경험상 db필드명자체에 카멜/헝가리표기법이 사용되거나 혼용되는

방식은 추천되지 않습니다.( 일괄적으로 대문자이던지? 소문자이던지?)

지역 네이밍룰

만약 네이밍규칙을 다르게하고싶으면, Class명 혹은 필드명 바로위에 아래와같은 어노테이션을 사용합니다.

이미 만들어진 테이블이 있고, 네이밍 규칙을 전체적으로 통일할수 없을시 부분 적용가능합니다.

  • @Table(name=”SAMPLE_TABLE”)
  • @Column(name = “COLUMN_NAME”,nullable=false) 

...

No Format
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

각각의 DB에따라 약간식 틀린 SQL문을 방언이라고하며 , JPA에서는 특수한 DB를 사용했을시

방언지정을 통해  소스변경없이, JPA의 일괄적인 인터페이스내에서 작동되도록 지원합니다.

예를들면 MYSQL에서는 페이지처리를 위해서 Limit를 쓴다거나, Oracle에서는 Rownum을쓴다거나 

하는 차이를 알필요없이 JPA가 제공하는 Pageable을 통해 공통처리가 된다는것입니다.


Expand
title방언표

Database 방언(Dialect)

방언이란 서로 다른 Database간의 SQL문법 차이를 말하며 JPA 구현체들은 이를 보정해 주기 위해 Dialect Class를 제공한다 이를 통해서 Database가 변경되어도 Dialect Class교체 만으로 코드 변경없이 문제를 해결 할 수 있게 된다.

Hibernate 의 Dialect 리스트는 아래 와 같다.

Name설명
Cache71DialectCaché 2007.1 dialect.
DataDirectOracle9Dialect
 

DB2390DialectAn SQL dialect for DB2/390.
DB2400DialectAn SQL dialect for DB2/400.
DB2DialectAn SQL dialect for DB2.
DerbyDialectHibernate Dialect for Cloudscape 10 - aka Derby.
DialectRepresents a dialect of SQL implemented by a particular RDBMS.
FirebirdDialectAn SQL dialect for Firebird.
FrontBaseDialectAn SQL Dialect for Frontbase.
H2DialectA dialect compatible with the H2 database.
HSQLDialectAn SQL dialect compatible with HSQLDB (HyperSQL). HSQLDialect.ReadUncommittedLockingStrategy
InformixDialectInformix dialect. Seems to work with Informix Dynamic Server Version 7.31.UD3, Informix JDBC driver version 2.21JC3.
Ingres10DialectA SQL dialect for Ingres 10 and later versions.
Ingres9DialectA SQL dialect for Ingres 9.3 and later versions.
IngresDialectAn SQL dialect for Ingres 9.2.
InterbaseDialectAn SQL dialect for Interbase.
JDataStoreDialectA Dialect for JDataStore.
MckoiDialectAn SQL dialect compatible with McKoi SQL.
MimerSQLDialectAn Hibernate 3 SQL dialect for Mimer SQL.
MySQL5DialectAn SQL dialect for MySQL 5.x specific features.
MySQL5InnoDBDialect MySQLDialectAn SQL dialect for MySQL (prior to 5.x).
MySQLInnoDBDialect
 

MySQLMyISAMDialect
 

Oracle10gDialectA dialect specifically for use with Oracle 10g.
Oracle8iDialectA dialect for Oracle 8i.
Oracle9DialectDeprecated. Use either Oracle9iDialect or Oracle10gDialect instead
Oracle9iDialectA dialect for Oracle 9i databases.
OracleDialectDeprecated. Use Oracle8iDialect instead.
PointbaseDialectA Dialect for Pointbase.
PostgresPlusDialectAn SQL dialect for Postgres Plus
PostgreSQLDialectAn SQL dialect for Postgres For discussion of BLOB “support” in postrges, as of 8.4, have a peek at http://jdbc.postgresql.org/documentation/84/binary-data.html.
ProgressDialectAn SQL dialect compatible with Progress 9.1C Connection Parameters required: hibernate.dialect org.hibernate.sql.ProgressDialect hibernate.driver com.progress.sql.jdbc.JdbcProgressDriver hibernate.url jdbc:JdbcProgress:T:host:port:dbname;WorkArounds=536870912 hibernate.username username hibernate.password password The WorkArounds parameter in the URL is required to avoid an error in the Progress 9.1C JDBC driver related to PreparedStatements.
RDMSOS2200DialectThis is the Hibernate dialect for the Unisys 2200 Relational Database (RDMS).
ResultColumnReferenceStrategyDefines how we need to reference columns in the group-by, having, and order-by clauses.
SAPDBDialectAn SQL dialect compatible with SAP DB.
SQLServer2008DialectA dialect for Microsoft SQL Server 2008 with JDBC Driver 3.0 and above
SQLServerDialectA dialect for Microsoft SQL Server 2000 and 2005
Sybase11DialectA SQL dialect suitable for use with Sybase 11.9.2 (specifically: avoids ANSI JOIN syntax)
SybaseAnywhereDialectSQL Dialect for Sybase Anywhere extending Sybase (Enterprise) Dialect (Tested on ASA 8.x)
SybaseASE15DialectAn SQL dialect targetting Sybase Adaptive Server Enterprise (ASE) 15 and higher.
SybaseDialectDeprecated. use AbstractTransactSQLDialect, SybaseASE15Dialect or SQLServerDialect instead depending on need.
TeradataDialectA dialect for the Teradata database created by MCR as part of the dialect certification process.
TimesTenDialectA SQL dialect for TimesTen 5.1.



Data Model(Entity) 생성

Code Block
languagejava
themeEmacs
titleUser Entity
package com.psmon.springdb;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity // This tells Hibernate to make a table out of this class
public class User {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	private String name;
	
	private String email;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}

...