アイデンティティマップのヌルキー
-
03-07-2019 - |
質問
IDマップで使用されるドメインオブジェクトがあります(キーはオブジェクトの Id
プロパティです)。
擬似コード:
map = new Mapping();
map[domainObj.Id] = 'foo';
オブジェクトを観察して、データベースに保存されたことを通知します:
domainObj.bind('saved', function() {
map[domainObj.Id] = 'new foo!'
})
新しいオブジェクトの場合、 Id
フィールドは空であり、データベースに保存されるまで入力されません。
そして、そこに私の問題があります。新しいオブジェクトの場合、ルックアップ" map [domainObj.Id]
"保存後にオブジェクトのIDが変更されたため、失敗します!
このようなIDマップでオブジェクトを使用する最良の方法は何ですか?
制約:
- マッピングのキーとしてオブジェクトを許可しない言語を使用しています[JavaScript]
-
Id
フィールドは、新しいオブジェクトを保存するときにサーバー上で生成する必要があります
更新
フィードバックをありがとう。エンティティと同じ方法で値オブジェクトをマップしたいのです。値オブジェクトが保存されていないからといって、アプリケーションにマップする値がないというわけではありません。実際、アイデンティティマップとは誤解しています(パターン定義を読み直した後、実際には使用していないことがわかりました)。
私が思いついた解決策は、イゴールの答えからほぼそのままです。各オブジェクトは、インスタンス化時にランダムなIDを割り当てられます。オブジェクトが存在するコンテキストの存続期間中、一意で不変で不変です。これは、dbからのエンティティと新しいインスタンス化の両方に対して存在します。エンティティの微調整は、オブジェクトの実際のIDと一致するように設定されることです。これにより、デバッグが少し簡単になります。これは、マッピングでキーとして使用する値です。
解決
オブジェクトがIDを取得するまで、それは単なる値オブジェクトです。アイデンティティが確立されて初めてエンティティになります。
オブジェクトがエンティティになるまで、自分のようなアイデンティティマップに実際に配置することはできません-それを引き出すことはできないため、意味がありません(見つけるための一意のキーがないため)。
1つの可能なアプローチ:
- オブジェクトの状態(新規/保存済み)を示すフラグをクラスに追加します。
- これらのオブジェクトの一時(クライアント側)IDを実装します
- オプション:
- " new" 別個の IDマップのオブジェクト(クライアントIDとサーバーIDのIDの競合をできない場合)
- " new" 同じ IDマップ内のオブジェクト(クライアントIDとサーバーID間のIDの競合を 回避できる場合)
- オブジェクトが保存されたら、クライアントIDをサーバーIDに置き換え、状態を保存済みに設定し、メインIDマップに移動します(必要な場合)。
他のヒント
まあ、オブジェクトを保存してIDを割り当てるまで後まで、オブジェクトをマップに追加するのを延期する方法を見つける必要があります。