주키 정하기
Natural key vs Surrgate key
- 후보키candidate key는 다음과 같은 특징을 가진다.
- NULL 값을 갖지 않는다.
- 유일한 값을 갖는다.
- 값이 절대로 변하지 않는다.
- A natural key is a key with business meaning: an attribute
or combination of attributes that is unique by virtue of its business
semantics.
- Natural key를 주키로 사용해 왔지만, 다음과 같은 문제가 있다.
- 변하지 않고, 고유하면서, 필수인 값을 찾기가 어렵다. 주키 값을 변경하는 작업은 완전 빡쎄며, 인덱스로 사용하기도 적절하지 않다.
- 주로 복합키로 구성되는데, 이 것들이 보통 쿼리 작성, 스키마 수정, 유지보수를 어렵게 한다.
- 그래서 Surrogate key 사용을 추천한다.
- Surrogate keys have no business meaning—they're unique values generated by the database or application.
key generator 선택하기
- Hibernate has several built-in identifier-generation strategies.
Generator name | JPA Generation Type | Option | 설명 |
---|---|---|---|
native | AUTO | 사용하는 DB에 따라서 sequence, hilo, identity를 알아서 선택함. 설정의 이식성을 고려한다면, 이 설정을 사용할 것. | |
identity | IDENTITY | DB2, MySQL, MS SQL Server, Sybase, HypersonicSQL에 있는 identity 컬럼을 지원한다. long, short, int 타입의 값을 반환함. | |
sequence | SEQUENCE | sequence, parameters | DB2, PostgreSQL, Oracle, SAP DB, Mckoi에서 sequence를 생성한다. long, short, int 타입의 값을 반환함. sequence 옵션을 사용해서 시퀀스의 이름을 설정할 수 있고, DDL에 추가할 시퀀스를 만들 때 필요한 추가 세팅이 필요할 때 parameters를 사용함. |
increment | 하이버네이트가 동작하면서 테이블의 주키 컬럼 값 중에 최대값을 읽은 다음 새로운 레코드를 추가할 때, 그 값을 1씩 증가시킴. 단일 서버에서 DB에 독립적으로 접근하는 경우 외에는 사용하지 말아라. | ||
hilo | table, column, max_lo | A high/low algorithm is an efficient way to generate identifiers of type long, given a table and column as a source of high values. |
|
seqhilo | sequence, parameters, max_lo | named database sequence에서 high 값을 걷는 것을 빼고 hilo와 동일하다. | |
TABLE | table, catalog, schema, pkColumnName, valueColumnName, pkColumnValue, allocationSize | TABLE relies on a database table that holds the lastgenerated integer primary key value, and each generator is mapped to one row in this table. |
|
uuid.hex | separator | This generator is a 128-bit UUID (an algorithm that generates identifiers of type string, unique within a network). | |
guid | This generator provides a database-generated globally unique identifier string on MySQL and SQL Server. | ||
select | key | This generator retrieves a primary key assigned by a database trigger by selecting the row by some unique key and retrieving the primary key value |
하이버네이트 identity generator 사용하기
@Entity
@org.hibernate.annotations.GenericGenerator(name="hibernate-uuid", strategy="uuid")
@Table(name="CATEGORY")
public class Category {
@Id
@GeneratedValue(generator="hibernate-uuid")
@Column(name="CATEGORY_ID")
private Long id;
public Long getId() {
return id;
}
}
- hibernate-uuid라는 이름으로 uuid 생성기를 사용하는 코드.
- You aren't limited to the built-in strategies; you can
create your own identifier generator by implementing Hibernate's
IdentifierGenerator interface.