単一Entityの操作

SQLの発行タイミングについて

  • 基本的に、SQLの発行はトランザクションの終わりに発行される。

    • 永続化前のEntityへの操作は、永続化を行ったタイミングの断面でInsert文がキューされる

    • 永続化後のEntityへの操作は、最終的な結果となるUpdate文がキューされる

      • Updateの場合、値をいじっていない項目もUpdate対象となる。(SQLが発行されるためFUNCTION等との競合に注意)

  • find等の取得処理は、取得した段階で永続化される。(以降の処理は上記同様)

    • 関連エンティティは設定されたフェッチ戦略によってSQL発行タイミングが異なる

      • EAGER: データベースからエンティティの情報を読み込むときに,関連するフィールドやエンティティの情報を読み込まれる

      • LAZY: フィールドまたは関連先に初めてアクセスしたときにデータベースからの読み込みが実行される

SQL発行例

// Entity新規作成
Entity ent = Entity.builder()
    .strA("AAA")
    .strB("BBB")
    .strC("CCC").build();

// 永続化前に値を変更
ent.setStrA("XXX");

// 永続化(※中身の操作:persist(ent))
repository.save(ent);

// 永続化後に値を変更
ent.setStrA("AAA");
ent.setStrB("YYY");
// 永続化した断面でのInsertが発行されている
Insert Into entity_table (strA, strB, strC) Values('XXX', 'BBB', 'CCC');

Update entity_table set
  strA = 'AAA' // newした当時の値に戻っているが、永続化後に変化しているため更新
  strB = 'YYY' // 永続化後の変化の為更新される
  strC = 'CCC' // 変化していないが、UPDATE文には入る
WHERE
  ~~~;