Name
インスタンスを一意に識別するために使用されるメンバーを持つ単純なクラスがあります。Name
このクラスは、 (主キーであるため) を使用してマッピング テーブルを作成するManyToMany マッピングで参照されます。関連する文字列のタイプにより、これは非常に遅くなります (長さ > 128 文字、多くの場合、最後の数文字だけが異なります)。高速化するために、結合用の列 (私は MySQL を使用しています) を作成したいと思いますauto_increment
が、-column を使用して nhibernate でオブジェクトの一意性を並べ替えることができますName
。
これがどのように見えるかの例です。実際には、オブジェクトははるかに大きくなります。
class MyObject{
public String Name;
public String Value;
}
//Mapping
Id(x => x.Name)
.Length(255)
.Unique();
Map(x => x.Value);
これは意図したとおりに機能します。テーブルに新しいものを追加するMyObject
と、nhibernate は最初に選択を行い、同じレコードName
が既にテーブルにあるかどうかを確認します。
ObjectHolder
のセットを持つ がありますMyObject
class ObjectHolder{
public UInt64 Id;
public ICollection<MyObject> MyObjects;
}
//Mapping
Id(x => x.Id)
.GeneratedBy.Native();
HasManyToMany(x => x.MyObjects)
.AsSet()
.Cascade.SaveUpdate();
ObjectHolder.Id
これにより、 と を使用してマッピングが作成されますがMyObject.Name
、これは低速です。自動生成され、マッピングテーブルにのみ使用される Id 列が必要ですMyObject
が、nhibernate が主キーで行う、存在するかどうかを確認するためのチェックには使用されません。
マッピングを次のように変更しました
class MyObject{
public UInt64 Id;
public String Name;
public String Value;
}
//Mapping
Id(x => x.Id)
.GeneratedBy.Native();
Map(x => x.Name)
.Length(255)
.Unique();
Map(x => x.Value);
Name
これにより、auto_increment カラムが作成され、マッピング テーブルに使用されますが、同じレコードが既に存在するかどうかが正しくチェックされなくなり、エントリの重複例外が発生します。
nhibernate にName
、id の代わりに列をチェックするように指示したり、 -column に注釈を付けてId
、外部キーとしてのみ使用されるようにすることはできますか? manyToMany マッピングを変更する必要がありますか?
編集:複合IDを使用する必要がある場合はさらに悪いようです。すべての id プロパティは、オブジェクト自体に 1 回、マッピングに 1 回、合計 2 回保存されるため、時間とストレージ スペースのオーバーヘッドが大幅に増加します。