質問
私のシナリオは次のとおりです。
- タグ付けできるオブジェクト(メッセージ)がいくつかあります
- つまり、Tagエンティティと多対多の関係があります
- 上記は完了し、動作しています
- 今、タグ付けするとき、新しいタグが存在しない場合にのみ保存します(タグのタイトルで存在を確認します)
- タグが既に存在する場合、新しいタグではなく認識してオブジェクトに添付したい
最も簡単でクリーンな方法は何ですか?
ところで、何らかの理由で、タグエンティティに人工的な主キー(数値ID)を使用したいと思います。
ありがとう!
解決
ビジネスクラスで表現し、NHibernateでマップできる多対多の関係があります。多対多の関係を解決するリンクテーブルの構造により、オブジェクトが同じタグに複数回リンクされるのを防ぐことができます。
質問にルールを適用する唯一の方法はコードを使用することです。タスクのシーケンスは次のようになります。
- ユーザーが入力したタグリストを個々のタグに解析する
-
タグをループする...
a。タグが存在する場合は、オブジェクトのタグコレクションに追加します
b。そうでない場合は、新しいタグを作成して、オブジェクトのタグコレクションに追加します
-
オブジェクトの永続化
つづりの間違い、大文字の使用、代替使用を考慮して、既存のタグを検索するロジックを追加する必要があります。たとえば、「ASPNET」などの同じ文字列ではなく同じ文字列ではないことを意味するタグは必要ありません。または「ASP.NET」または「asp.net」。タグリストの品質は、既存のタグをチェックするコードの堅牢性に依存します。
他のヒント
明確にするために-タグは多くのオブジェクトに固定でき、オブジェクトは多くのタグを持つことができます。それが私にとって多対多の関係の意味です。どういう意味ですか?
SQLでこれを行うと、TAGおよびOBJECTという名前のテーブルと、他のテーブルの各主キーに対応する2つの列を含むTAG_OBJECTという名前の結合テーブルがあります。 TAG_OBJECT結合テーブルの主キーは、ペア(TAG_ID、OBJECT_ID)です。これにより、行ごとに一意のペアリングが保証されます。
Hibernateを使用している場合、オブジェクトのリストまたはコレクションをプライベートデータメンバーとしてタグクラスに追加し、タグのリストまたはコレクションをプライベートデータメンバーとしてオブジェクトクラスに追加するだけです。
「深い平等」を判断するための優れた方法を記述している限り、Hibernateは「存在しない場合のみ」を処理すると思います。 Tagの2つのインスタンス間。
また、タグタイトル属性に一意の制約を追加する必要があります。 JavaとXMLであるため、ニーズに合わない例を次に示しますが、NHibernateを探す場所を示すには、おそらくそのヒントで十分でしょう。
<element column="serialNumber" type="long" not-null="true" unique="true"/>
あなたの場合、列はタグのタイトルになり、タイプは文字列になり、他のフラグは例のように残ります。