Bulk & History
保存ライフサイクルが適用される一般的な保存とバルクインサート/アップサート、バックアップ削除、履歴スナップショットの動作の違いを区別します。
save / saveAll
save(entity)
id がない場合は insertOne、id がある場合は _id 基準で replaceOne(..., upsert=true) を使用します。
saveAll(...)
各エンティティに対して save() を実行するため、 beforePersist/afterPersist ライフサイクルフックが適用されます。
バルクAPIの選択
saveAllBulk
insertMany ベースのバルクインサートです。既存のidを更新するAPIではありません。
saveAllBulkUpsert
エンティティidがない場合は挿入、ある場合は _id フィルター + $set + アップサートを実行します。
saveAllBulkUpsertByKey
業務複合キーを基準にアップサートします。キーのいずれかがない場合、そのエンティティは挿入として処理されます。
エンティティ削除とバックアップ削除
backup을 활성화하면 <sourceCollection>_remove collection을 사용합니다. delete와 backup을 하나의 원자 작업으로 묶어야 한다면 호출 측에서 getTxJob(...) transaction 범위를 잡습니다.
履歴スナップショット
createHistory는 현재 MongoExecutionContext.write(...) 결과를 deep copy하고 _id를 제거한 뒤 <sourceCollection>_history 또는 지정한 prefix collection에 insert합니다. history write도 save lifecycle hook을 호출하지 않습니다.