プライマリ・キーのマッピング



リファレンス
  • 金英漢インフラ講座-Java ORM標準JPAプログラミング-基本編
  • Java ORM標準JPAプログラミング
  • デフォルトのキーマッピング宣言

  • @Id
  • @GeneratedValue
  • @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    プライマリ・キーのマッピング方法

  • 直接割当:
  • 、IDのみ
    自動作成
  • (@GenerateValue)
  • IDENTITY:データベースに委任、MYSQL
  • SEQUENCE:データベースシーケンスオブジェクトを使用して、ORACLE
    -必要@Sequence Generator
  • TABLE:鍵を生成するテーブル、すべてのデータベース
    -必要@Table Generator
  • AUTO:方言によって自動的に指定され、デフォルト値
  • ちょくせつわりあて

  • @Id使用
  • 通常、@Idと@GenerateValueを同時に使用します.

    IDENTITY戦略


    特長

  • このポリシーはPKがINSERT Queryを発行した後、PK値によって決定される.ただし、永続性コンテキストではPK値
    必ずあるので、JPAはキー値がメインキャッシュマッピングに入っていないので入れられません.
    最終的に、JPAは、この場合のみpersist()時にINSERT Queryを発行する.
  • バッファできない
  • idは
  • persist()ポイントでクエリーできます.(selectクエリは消えません.)
  • プライマリ・キー生成をデータベース
  • に委任する.
  • 主にMySQL、PostgreSQL、SQL Server、DB 2用
    (例えば、MySQLのAUTO INCREMENT)
  • JPAは通常、トランザクションのコミット時にINSERT SQL
  • を実行します.
  • AUTO INCREMENTデータベースでINSERT SQLを実行すると、ID値
  • がわかる.
  • IDENTITYポリシーem.persist()の直後にINSERT SQLを実行し、DBで識別子
  • を問合せます.

    マッピング

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

    SEQENCEポリシー


    特長

  • データベース・シーケンスは、一意の値
  • を順番に生成する特殊なデータベース・オブジェクト(oracleシーケンスなど)です.
  • Oracle、PostgreSQL、DB 2、H 2データベースで
  • を使用
  • ネットワークで切り替え(next call~)すると性能が低下しませんか?
  • JPAのinitValueおよび割り当てSizeオプションにより、パフォーマンスが最適化されます.
  • pkはどんなタイプなのか、longタイプに指定しましょう!

    マッピング

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

    @SequenceGenerator

  • 警告:割り当てSizeのデフォルト=50
  • 属性機能デフォルトname識別子ジェネレータ名必須シーケンス名は、データベースに登録されているシーケンス名hibernate sequenceinitialValue DDLの作成時にのみ使用されます.シーケンスDDLの生成時に最初に開始する数値を指定します.構成シーケンスが呼び出しごとにデータベース・シーケンス値を1つ増加するように設定されている場合(パフォーマンス最適化のため)、この値を50(50~100が適切な値)catalog、schemaデータベースcatalog、schema名に設定する必要があります.
  • call nextvalue 2番コール!
  • その理由は、DB SEQ=1(Dummy呼び出し)を初めて呼び出したときに変な感じがするため、
    そして再度呼び出す(DB SEQ=51).
  • と50回前に、メモリから取得してそれを超え、50回増加します.
  • クエリー呼び出しを最小化できます.
  • 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;
    }

    @Table Generator-プロパティ


    属性機能デフォルト名識別子ジェネレータ名に必要なテーブルキー表名hibernate sequencespkColumnNameシーケンス名シーケンス名ColumnNameシーケンス値カラム名カラム名カラム名カラム名カラム名カラム名値値値値値値値値値エンティティ名の初期値として使用します.最後に生成された値は基準です.0は、パフォーマンス最適化用にSizeシーケンスの1回の呼び出しで増加した50 catalog、schemaデータベースcatalog、schema名uniqueConstraints(DDL)固有の制約を割り当てることができます.

    推奨識別子ポリシー

  • デフォルト鍵制約:null以外、一意、変更不可.
  • の将来,この条件を満たす自然キーを見つけることは困難である.代替キーを使用します.
  • 例えば、
  • 、住民身分証明書番号は基本鍵で、寂しくありません.
  • 提案
  • :long型+代替鍵+鍵生成ポリシー
  • を使用