🐈

JPAの主キー(プライマリキー)マッピング

2022/02/02に公開

@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から識別子を照会する。

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生成時のみ使用される、初期値指定
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型 + 代理キー + 主キー生成戦略を使用。

(次)関係マッピング(リレーショナルマッピング)

https://zenn.dev/dev_yoon/articles/7749e61bd47fbd

Discussion