JAP 사용시 가장 중요한 일은 엔티티와 테이블의 정확한 매핑이다. 따라서 매핑 어노테이션을 반드시 숙지하고 있어야 한다.

 

 

 

■ 대표 어노테이션

 

- 객체와 테이블 매핑 : @Entity, @Table

- 기본 키 매핑 : @Id

- 필드와 컬럼 매핑 : @Column

- 연관관계 매핑 : @ManyToOne, @JoinColumn

 

 

 

Entity

 

JAP를 사용해서 테이블과 매핑할 클레스는 @Entity 어노테이션을 필수로 붙여야 한다. @Entity가 붙은 클래스는 JAP가 관리하는 것으로, 엔티티라 부른다. 

속성 기능
name JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 다른패키지에 같은 엔티티 이름이 지정되지 않도록 해야한다. 설정하지 않으면 클래스 이름을 그대로 사용한다. ex) Member

@Entity 적용시의 주의 사항은 아래와 같다.

- 기본생성자는 필수 (파라미터가 없는 public 또는 protected)

- final, enum, interface, inner 클래스에는 사용할 수 없다.

- 저장할 필드에 final을 사용하면 안된다.

- 기본생성자는 반드시 있어야 한다. ex) public Member() {} // 기본생성자

 

 

 

Table

 

@Table은 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

속성 기능
name 매핑할 테이블 이름. 없을시 엔티티 이름을 사용한다.
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다.
schema schema 기능이 있는 데이터베이스에서 schema를 매핑한다.
uniqueConstraints (DDL) DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 생성 가능하다. 해당 기능은 스키마 자동생성 기능을 사용해서 DDL을 만들시에만 사용한다.

 

 

 

■ 기본키 할당 전략

 

기본키 직접 할당 전략은 em.persist() 로 엔티티를 저장하기 전에 애플리케이션에서 기본 키를 직접 할당하는 방법이다.

 

기본키를 직접 할당하기 위해서는 @Id 로 매핑하면 된다.

@Id
@Column(name = "id")
private String id;

 

@Id 적용 가능 자바 타입은 다음과 같다.

- 자바 기본형

- 자바 래퍼(Wrapper) 형

- String

- java.util.Date

- java.sql.Date

- java.math.BigDecimal

- java.math.BigInteger

 

 

1. IDENTITY 전략

 

IDENTITY 는 기본 키 생성을 데이터베이스에 위임하는전략이다. 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다. 데이터베이스에 값을 저장할 때 ID 컬럼을 비워두면 데이터베이스가 순서대로 값을 채워준다.

사용하기 위해서는 @Id 어노테이션에 @GeneratedValue 어노테이션을 사용하고 식별자 생성 전략을 선택해야 한다.

IDENTITY 전략을 사용하기 위해서는 strategy 속성 값을 GenerationType.IDENTITY 로 지정하면 된다.

 

@Entity
public class Board {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    ...
}

 

 

2. SEQUENCE 전략

 

데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다. SEQUENCE 전략은 이 시퀀스를 사용해서 기본 키를 생성한다. 주로 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용할 수 있다. 시퀀스는 미리 생성해두어야 한다.

 

@Entity
@SequenceGenerator(
	name = "BOARD_SEQ_GENERATOR",
    sequenceName = "BOARD_SEQ", // 매핑할 데이터베이스 시퀀스 이름
    initialValue = 1, allocationSize = 1)
    
public class Board {
	@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
    		generator = "BOARD_SEQ_GENERATOR")
    private Long id;
    ...
}

 

@SequenceGenerator 를 사용해서 BOARD_SEQ_GENERATOR라는 시퀀스 생성기를 등록한다. 그리고 sequenceName 속성의 이름으로 BOARD_SEQ 를 지정했는데 JPA는 이 시퀀스 생성기를 실제 데이터베이스의 BOARD_SEQ 시퀀스와 매핑한다. 또한 키전략을 GenerationType.SEQUENCE로 설정하고 generator = "BOARD_SEQ_GENERATOR" 로 방금 등록한 시퀀스를 선택한다.

 

- @SequenceGenerator 속성

속성 기능 기본값
name 식별자 생성기 이름 필수
sequenceName 데이터베이스에 등록되어 있는 시퀀스 이름 hibernate_sequence
initalValue DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다. 1
allocationSize 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) 50
catalog, schema 데이터베이스 catalog, schema 이름  

 

'develop > JPA, Hibernate' 카테고리의 다른 글

엔티티 매니저 등록/수정/삭제/조회 정리  (0) 2019.11.24
엔티티 매니저 설정, 생성과정  (0) 2019.11.24
데이터베이스 방언  (0) 2019.10.19
JPQL 이란? (querydsl)  (0) 2019.10.12
Hibernate 란?  (0) 2019.09.30

JPA는 항상 엔티티 매니저를 통하여 등록/수정/삭제/조회 가 이루어진다.

 

 

 

- 등록

 

String id ="id1";
Member member = new Member();
member.setId(id);
member.setUsername("사용자");
member.setAge(20);

em.persist(member);

엔티티를 저장하려면 persist() 메소드에 저장할 엔티티를 넘겨주면 된다.

위의 코드는 INSERT 와 같은 기능을 하게 된다.

 

 

 

- 수정

 

member.setAge(20);

수정은 별도의 update()와 같은 메소드가 필요없이 set...()처럼 값만 변경해주면 가능하다.

위의 코드는 UPDATE 와 같은 기능을 하게 된다.

 

 

 

- 삭제

 

em.remove(member);

삭제는 remove(member) 메소드를 사용한다.

위의 코드는 DELETE 와 같은 기능을 하게 된다.

 

 

 

- 단건 조회

 

Member member = em.find(Member.class, id);

find() 메소드는 조회할 엔티티 타입과 @Id 로 데이터베이스 테이블의 기본키와 매핑한 식별자 값으로 조회한다.

위의 코드는 SELECT 와 같은 기능을 하게 된다.

'develop > JPA, Hibernate' 카테고리의 다른 글

엔티티 매핑, 기본키 할당 전략  (0) 2019.12.16
엔티티 매니저 설정, 생성과정  (0) 2019.11.24
데이터베이스 방언  (0) 2019.10.19
JPQL 이란? (querydsl)  (0) 2019.10.12
Hibernate 란?  (0) 2019.09.30

엔티티 매니저 생성 과정

 

 

- 엔티티 매니저 팩토리 생성

 

JPA응 시작하려면 첫번째로 persistance.xml의 설정 정보를 사용하여 엔티티 매니저 팩토리를 생성해야 한다. 이때 사용하는 클래스로 Persistance 를 사용하는데 이 클래스는 엔티티 매니저 팩토리를 생성해서 JAP를 사용할 수 있게 준비해준다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");

위와 같이 하면 META-INF/persistance.xml 에서 이름이 "jpabook"인 영속성 유닛 persistance-unit을 찾아서 엔티티 매니저 팩토리를 생성한다. 엔티티 매니저 펙토리를 생성하는 비용은 매우 크므로 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야 한다.

 

 

 

- 엔티티 매니저 생성

 

EntityManager em = emf.createEntityManager();

엔티티 매니저 팩토리에서 앤티티 매니저를 생성한다. JPA의 기능 대부분은 엔티티 매니저가 제공한다. 대표적으로 엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다. 엔티티 매니저는 내부에 데이터소스를 유지하면서 데이터베이스와 통신하므로, 엔티티 매니저를 가상의 데이터베이스로 생각할 수 있다. 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안된다.

 

 

 

- 종료

 

사용이 끝난 엔티티 매니저와 엔티티 매니저 팩토리는 다음처럼 반드시 종료해야 한다.

em.close();		// 엔티티 매니저 종료
emf.close();		// 엔티티 매니저 팩토리 종료

 

 

 

- 트랜잭션 관리

 

JPA를 사용하면 항상 트랜잭션 안에서 데이터베이스를 변경해야 한다. 트랜잭션없이 데이터를 변경하면 예외가 발생한다.

 

'develop > JPA, Hibernate' 카테고리의 다른 글

엔티티 매핑, 기본키 할당 전략  (0) 2019.12.16
엔티티 매니저 등록/수정/삭제/조회 정리  (0) 2019.11.24
데이터베이스 방언  (0) 2019.10.19
JPQL 이란? (querydsl)  (0) 2019.10.12
Hibernate 란?  (0) 2019.09.30

JAP는 특정 데이터베이스에 종속적이지 않은 기술이므로, 개발시 어느 데이터베이스를 사용하던지 손쉽게 교체 할 수 있고, 사용함에 있어서 이상이 없어야 한다. 일반적으로 각각의 데이터베이스는 문법과 함수가 다른데, 예를 들어서 아래와 같다.

 

- 데이터 타입 : 가변문자 타입으로 MySQL은 VARCHAR, 오라클은 VARCHAR2를 사용한다.

- 다른 함수명 : 문자열을 자르는 함수로 예를 들면 SQL 표준은 SUBSTRING() 이지만, 오라클은 SUBSTR()을 사용한다.

- 페이징 처리 : MySQL 은 LIMIT를 사용하지만 오라클은 ROWNUM을 사용한다.

 

이와같이 SQL별로 표준을 지키지 않은 데이터베이스만의 고유한 기능을 '데이터베이스 방언' 이라고 한다. JAP 구현체는 이러한 문제점을 해결하기 위하여 데이터베이스 방언 클래스를 제공한다. JPA를 사용하고있는 프로젝트의 개발자는 이에 대하여 사용하는 데이터베이스가 변경되더라도 데이터베이스 방언만 교체하면 쉽게 데이터베이스를 변경할 수 있다.

 

 

데이터베이스 방언을 사용하는 예

 

하이버네이트에는 다양한 데이터베이스 방언을 제공한다. 대표적으로 아래와 같다.

- H2: org.hibernate.dialect.H2Dealect

- 오라클 10g : org.hibernate.dialect.Oracle10gDialect

- MySQL : org.hibernate.dialect.MySQL5InnoDBDialect

 

 

 

● 참고

하이버네이트가 지원하는 여러 데이터베이스 방언 항목들

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#configuration-optional-dialects

 

HIBERNATE - Relational Persistence for Idiomatic Java

Sometimes, you probably don't want to implement an intrusive interface, maybe due to portable concern, which is fine and Hibernate will take care of this internally with a wrapper class which implements that interface, and also an internal cache that maps

docs.jboss.org

 

'develop > JPA, Hibernate' 카테고리의 다른 글

엔티티 매니저 등록/수정/삭제/조회 정리  (0) 2019.11.24
엔티티 매니저 설정, 생성과정  (0) 2019.11.24
JPQL 이란? (querydsl)  (0) 2019.10.12
Hibernate 란?  (0) 2019.09.30
JPA, ORM이란 무엇인가?  (0) 2019.09.30

+ Recent posts