2009-06-19 6 views
1

私のシナリオは次のとおりです。NHibernate - 一意性を強制する方法?

  • 私は
  • をタグ付けすることができますいくつかのオブジェクト(メッセージを)だから私は上記のタグのエンティティと多対多の関係
  • を持っている行われ、働いています
  • タグ付けするときに、新しいタグが存在しない場合(存在がタグのタイトルで確認されている場合のみ)に保存したいと思います。
  • タグが既に存在する場合は、新しいものの代わりに私のオブジェクトに取り付けられる

これを行う最も簡単で簡単な方法は何ですか?

ところで、何らかの理由で私のTagエンティティに人工の主キー(数値Id)を使用したいと思います。

ありがとうございます!

答えて

1

ビジネスクラスで表現でき、NHibernateとマッピングできる多対多の関係があります。多対多の関係を解決するリンクテーブルの構造は、オブジェクトが同じタグに複数回リンクされないようにします。

あなたの質問にルールを適用する唯一の方法はコードです。タスクのシーケンスのようなものになります:

  1. 解析のユーザーが

    ...タグを通じて

  2. ループの個々のタグにタグリストに入りました。タグが存在する場合は、オブジェクトのタグコレクションに追加します。

    b。そうでなければ、新しいタグを作成して、オブジェクトのタグコレクションに

  3. を追加してくださいあなたはアカウントのスペルミス、大文字と小文字、および代替の使用を考慮して、既存のタグを探すためにロジックを追加する必要がありますオブジェクト

を持続。たとえば、同じことを意味するが、 "ASPNET"や "ASP.NET"や "asp.net"のような等価の文字列ではないタグを持つことは望ましくありません。タグリストの品質は、既存のタグをチェックするコードの堅牢性に依存します。

0

タグを多くのオブジェクトに固定することができ、オブジェクトには多くのタグを付けることができます。それは多対多関係が私にとって意味するものです。それがどういう意味ですか?

SQLでこれを行うと、TAGとOBJECTという名前のテーブルと、2つの列、つまり他のテーブルの各プライマリキーに対応するTAG_OBJECTという名前の結合テーブルがあります。 TAG_OBJECT結合テーブルの主キーはペア(TAG_ID、OBJECT_ID)です。これにより、各行に対してユニークなペアリングが保証されます。

Hibernateを使用している場合は、プライベートデータメンバーとしてのリストまたはオブジェクトのコレクションをTagクラスに追加し、タグのリストまたはコレクションをObjectクラスのプライベートデータメンバーとして追加します。

タグの2つのインスタンスの間の "深い等価性"を判断するための良い方法を書いている限り、Hibernateは "あなたが存在しない場合に限り"処理します。

タグのtitle属性にも一意制約を追加する必要があります。ここでは、JavaとXMLですので、非常に、あなたのニーズに適合しませんが、おそらくそのヒントはどこにNHibernateを探す場所をあなたに伝えるには十分だろう例です:あなたのケースのために

<element column="serialNumber" type="long" not-null="true" unique="true"/> 

、列は次のようになりますタグのタイトル、型は文字列であり、他のフラグは例のままです。

+0

ええ、そういう意味です。関係部分が完成して作業していますが、今はタグをユニークにしようとしています。さらなる議論のために、私がタグ付けしているオブジェクトがメッセージであるとしましょう。これはエンティティの1つのタイプです。 –

+0

私はHibernateがこれを管理すると思います。 title属性に一意の制約を追加する必要があるかもしれません。 – duffymo

+0

このように動作するため、一意性が壊れたときに例外がスローされます。私はこれを処理することができますが、私はよりクリーンな方法を探しています... –

関連する問題