いくつかの情報源は、NHibernate が具象クラスおよび共用体サブクラスごとのテーブルで ID を使用できないと述べています。これは本当ですか?この背後にある正確な理由は何ですか?
2 に答える
それは簡単です。POID は、ルート エンティティ タイプのすべてのインスタンスで一意である必要があります。
次の例を検討してください。
abstract class Vehicle { ... }
class Car : Vehicle { ... }
class Truck : Vehicle { ... }
具体的な型がわからないVehicle を取得する場合:
var carOrTruck = session.Get<Vehicle>(vehicleId);
...そして、その ID を持つ車とトラックの両方がありました (これは ID で可能です)。NHibernate はどちらを返しますか? (もっと複雑なケースもありますが、これは 1 つの考えられる問題を示しています)
したがって、table-per-concrete-class (私に言わせればかなり悪い戦略です) の場合、NHibernate はサブクラス全体で一意性を保証するジェネレーターを必要とします。
なぜそう言うのですか?そんなシチュエーションがいくつもあったと思います。また、このブログエントリは同じことを述べています。
以下のコメントを要約すると: Ayende が持っている例のように、すべてのルート タイプをクエリすると (つまり、「Select Party」)、ID の重複を取得できます。この事実と UNION 特性 (個別のレコードのみを返す) により、予期しない結果 (レコードの欠落) が生じる可能性があります。そのため、ID を使用できず、nhibernate が重複を回避できるようにする hilo を使用できます。