🐈
JPAの主キー(プライマリキー)マッピング
@Id
@Id
@Column(name = "MEMBER_ID")
private Long id;
- Idを直接マッピングする時
@Id
のみ使用。 - 数字タイプは基本
Long
を推奨する。-
Long
タイプが占めるメモリの量は全体のアプリケーションを考えた時にはとっても微々たるものだ、反面Long
より小さいタイプ(Integer
)を使ってから大きいタイプ(Long
)に変更する方がコスト的にもっと高い、ので主キーを決めるときはよく考えてから決めた方がいい。
-
@GeneratedValue
- 主キーを自動生成するときに使用
- いろんなstrategy(戦略)がある
GenerationType.IDENTITY戦略
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- 主キー生成をDBに委任する。
- 主にMySQL, PostgreSQL, SQL Server, DB2で使用されている。
- 例 ) MySQLの
auto_increment
- JPAは普通トランザクションのcommit時点にSQLを投げる、が
AUTO_ INCREMENT
はDBにINSERT SQLを投げてからIDの値を得られる。よってIDENTITY
戦略はem.persist()
時点に即INSERT SQLを投げDBから識別子を照会する。
- 例 ) MySQLの
GenerationType.SEQUENCE戦略
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ", initialValue = 1,allocationSize = 50)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
属性 | 説明 | ディフォルト値 |
---|---|---|
name |
@SequenceGenerator の名前 |
必須 |
sequenceName | DBに登録されているSequence名前 | hibernate_sequence |
initValue | DDL生成時のみ使用される、初期値指定 | 1 |
allocationSize | Sequenceを一度呼び出すときに増える数 | 50 |
catalog, schema | DBのcatalog, schema名前 | ---- |
- DB SEQUENCEは唯一な値を順番通りに生成する特別なDBオブジェクト。
- 主にOracle, PostgreSQL, DB2, H2 DBで使用される。
- 例 ) OracleのSEQUENCE
-
@SequenceGenerator
必要 -
allocationSize
を利用して性能チューニングできる。
GenerationType.TABLE戦略
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
属性 | 説明 | ディフォルト値 |
---|---|---|
name |
@TableGenerator の名前 |
必須 |
table | キー生成テーブル名 | hibernate_sequence |
pkColumnName | Sequenceカラム名 | sequence_name |
valueColumnNa | Sequence Valueカラム名 | next_val |
pkColumnValue | キーで使用する値の名前 | entity名 |
initValue | 初期値指定 | 0 |
allocationSize | Sequenceを一度呼び出すときに増える数 | 50 |
catalog, schema | DBのcatalog, schema名前 | ---- |
uniqueConstraints | Unique制約を追加できる | ---- |
- 主キー生成専用テーブルをひとつ作りDB SEQUENCE戦略を真似する戦略。
- 全てのDBで使用可能だが性能上不利
-
@TableGenerator
必要
GenerationType.AUTO戦略
@Id
@GeneratedValue
private Long id;
- DBの方言(Dialect)によって自動的に指定,
@GenerationValue
の基本戦略
推奨する識別子戦略
- 主キー制約条件は
not null
,unique
, 不変であることだが - 遠未来までこの条件を満たす自然キーを探すのは難しい. → 代理キーを使用しよう
-
推奨 :
Long
型 + 代理キー + 主キー生成戦略を使用。
(次)関係マッピング(リレーショナルマッピング)
Discussion