티스토리 뷰
JPA 사용시 기본키를 할당하는 방법은 다음과 같다.
- 직접 자바 코드에서 할당
- 데이터베이스에게 위임 : IDENTITY, SEQUENCE, TABLE
1. 직접 자바 코드에서 할당
@Entity
public class Book {
@Id
private String bookNo;
@Column
private String BookName;
set...get...method
}
@id는 기본키를를 변수와 매핑하고, @Column은 다른 컬럼들을 각각 매핑한다.
em = emf.createEntityManager();
et = em.getTransaction();
et.begin();
Book b = new Book();
b.setBookNo("서1324"); //bookNo 기본키를 직접 자바코드에서 할당
b.setBookName("천국의아이들");
em.persist(b);
et.commit();
em.close();
기본키를 직접 정하고, set메서드를 통해 변수값을 넣고, persist메서드를 통해 데이터베이스에 전달한다.
2. IDENTITY 전략
MySQL같은 데이터베이스에는 주로 기본키로 사용되는 데이터 삽입 시 번호를 증가 및 생성 시켜주는 AUTO_INCREMENT라는 기능이 있다.
데이터베이스 테이블의 기본키에서 이 기능을 사용하고 있다면 JPA빈에서 다음과 같이 선언해주면 기본키의 생성을 데이터베이스에 위임 할 수있다.
@Entity
public class Staff {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private int staNo;
@Column
private String staName;
@Column
private byte staAge;
set.....get...
}
- @GeneratedValue(strategy = GenerationType.IDENTITY)
위와 같이 기본키로 매핑 되어있는 @Id가 선언된 변수에 @GeneratedValue의 strategy 속성 값을 GenerationType.IDENTITY로 설정하여 선언하면 JPA는 기본키 값을 얻어오기 위해서 데이터베이스를 추가로 조회한다.
3. SEQUENCE 전략
이 전략은 시퀀스 기능을 지원하는 데이터베이스를 사용 시 기본키 매핑에 적용할 수 있다. ORACLE같은 데이터베이스는 시퀀스 기능을 가지고 있다.
4. TABLE 전략
기본키의 이름과 값으로 사용할 칼럼을 정의해서 기본키 생성만을 담당하는 테이블을 하나 만드는 방식이다.
@TableGenerator(allocationSize = 2,
pkColumnName = "name",
pkColumnValue = "book_no",
valueColumnName = "next_value",
table="tablegenerator",
name = "BOOK_SEQ")
@Entity
public class Book {
@GeneratedValue(strategy = GenerationType.TABLE, generator = "BOOK_SEQ")
@Id
private int bookNo;
@Column
private String BookName;
getter...setter....
}
이 전략을 사용하기 위해서는
@Entity가 선언된 곳에 @TableGenerator
@Id가 선언된 곳에 @GeneratedValue
를 선언해야한다.
각각의 어노테이션에 속성에 대한 설명은 다음과 같다.
@GeneratedValue(strategy = GenerationType.TABLE, 기본키 생선전략을 TABLE전략으로 사용함
generator = "BOOK_SEQ") @TableGenerator의 name속성의 값, 시퀀스생성기 이름
@TableGenerator(allocationSize = 2, 시퀀스 증가값
pkColumnName = "name", 데이터베이스에서 시퀀스 칼럼명
pkColumnValue = "book_no", 시퀀스 칼럼명에 넣을 칼럼값
valueColumnName = "next_value", 시퀀스 값
table="tablegenerator", 데이터베이스에서 실제 테이블명
name = "BOOK_SEQ") @GeneratedValue의 속성 generator값 시퀀스생성기 이름(필수)
TABLE 전략은 데이터베이스에서 시퀀스 값을 가져오기 위해 select문을 사용하고 다음 값으로 증가 시키기 위해 update문을 수행한다는 단점이 있다. 그리고 원래 작업하여고 했던 테이블에 대하여 insert문을 수행한다.
em = emf.createEntityManager();
et = em.getTransaction();
et.begin();
Book b = new Book();
b.setBookName("헤라클래스");
em.persist(b);
et.commit();
em.close();
//////////////////////////////////////////////////////////////////////////////////
Hibernate: select tbl.next_value from tablegenerator tbl where tbl.name=? for update
Hibernate: update tablegenerator set next_value=? where next_value=? and name=?
Hibernate: insert into book (book_name,book_no) values (?,?)
/////////////////////////////////////////////////////////////////////////////////
TABLE 전략을 사용할 때 데이터 삽입을 위해 persist수행 시 앞서 얘기 한 것처럼 쿼리문을 select(시퀀스테이블), update(시퀀스테이블), insert(BOOK테이블)문을 수행한다.
5. AUTO 전략
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private int staNo;
AUTO 전략을 사용하면 채택하고 있는 데이터베이스의 종류에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다.
MySQL 사용 시 IDENTITY를, ORACLE 사용 시 SEQUENCE를 사용한다.
strategy를 사용하지 않으면 기본값은 AUTO이다.
'SPRING > JPA' 카테고리의 다른 글
영속성 컨텍스트? (0) | 2024.10.10 |
---|---|
Spring 에서 JPA 사용 설정하기 (maven) (0) | 2024.10.10 |