写真とタグの間に多対多の関係があります。写真は複数のタグを持ち、複数の写真は同じタグを共有できます。NHibernateで多対多の関係で使用するアルゴリズム
ディレクトリ内の写真をスキャンしてNHibernateに追加するループがあります。そのプロセス中にいくつかのタグが写真に追加されます。 2009年に撮影された2009年のタグ。
タグクラスは、EqualsとGetHashCodeを実装し、唯一の署名プロパティとしてNameプロパティを使用します。写真とタグの両方に代理キーがあり、バージョンが変更されています。
public void Import() {
...
foreach (var fileName in fileNames) {
var photo = new Photo { FileName = fileName };
AddDefaultTags(_session, photo, fileName);
_session.Save(photo);
}
...
}
private void AddDefaultTags(…) {
...
var tag =_session.CreateCriteria(typeof(Tag))
.Add(Restriction.Eq(“Name”, year.ToString()))
.UniqueResult<Tag>();
if (tag != null) {
photo.AddTag(tag);
} else {
var tag = new Tag { Name = year.ToString()) };
_session.Save(tag);
photo.AddTag(tag);
}
}
私の問題があるタグが存在しない場合、例えば:
私は、次のようないくつかのコードを持っています新年の最初の写真。 AddDefaultTagsメソッドは、タグがデータベースに存在するかどうかを確認し、それを作成してNHibernateに追加します。 1枚の写真を追加するときにはうまくいくが、新年に複数の写真をインポートして同じ作業単位内でインポートすると、データベースにはまだ存在せず、再び追加されるので失敗する。作業ユニットを完了すると、同じ名前のタグテーブルに2つのエントリを追加しようとするので失敗します...
私の質問は、データベース内に単一のタグを作成しようとするだけです上記の状況。新しく追加されたタグのリストを自分で管理する必要がありますか、それともマッピングを設定して動作させることはできますか?
私はその部分をうまく説明しなかったことを申し訳なく思っています。私のFlushModeはNeverに設定されています。私は作業が完了したら明示的にフラッシュする作業単位内で作業しています。ああ、トランザクション内でも動いている。 – HakonB
ああ。 OK。新しいタグを挿入するコードのポイントでDBへの呼び出しに絶対に反対する場合、私はtheresがあなた自身のタグを追跡する以外の方法ではないと信じています。しかし、なぜそれをフラッシュしないのかわかりませんが、作業単位内の例外をロールバックすることはできます。 – asgerhallas
ロールバックの良さと注意点については、ここをクリックしてください:http://objectissues.blogspot.com/2004/12/understanding-hibernate-transaction.html – asgerhallas