Doctrine2のエンティティの変更トラッキング

Doctrine2では、エンティティの変更をトラッキングして最終的に必要な内容だけをDBに書き込むという仕組みがありますが、この「変更」のトラッキングにはいくつかオプションがあるようです。

  • Deferred Implicit(デフォルト)
    • flush()時に Unit of Work内のすべてのエンティティについて、エンティティのプロパティ単位で変更のチェックを行う。
  • Deferred Explicit
    • Deferred Implicitと似ているが、明示的にマーキングしたエンティティのみ変更のチェックを行う。
  • Notify
    • エンティティの変更をイベントで通知する。(イベントリスナーなどを実装する必要がある)

通常はデフォルトのDeferred Implicitで十分なようですが、バッチ処理など、大量のエンティティを扱う場合は、より後者の方がパフォーマンスが良くなるとドキュメントには記載されていました。
(変更フラグ処理自体のオーバーヘッドと、保存時のオーバーヘッドなどをイメージすると良いかもしれません)