2009-06-19 26 views
1

我的情況如下:NHibernate - 如何執行uniquenes?

  • 我有一些對象(消息),可以標記
  • 所以我有一個標籤實體和many-to-many關係
  • 以上等做工作
  • 現在,在標記時,我想只在不存在新標記的情況下(其中存在通過標記標題進行檢查)
  • 如果標記已存在,我希望它被識別並且附加到我的對象而不是一個新的

什麼是做到這一點的最簡單/乾淨的方式?

BTW,因爲某些原因,我想用人工主鍵(數字ID)爲我的標籤實體。

謝謝!

回答

1

你有許多一對多的關係,你可以在你的業務類表達並與NHibernate映射。解析多對多關係的鏈接表的結構將防止對象多次鏈接到同一個標記。

在您的問題中強制執行規則的唯一方法是通過代碼。任務的順序是這樣的:

  1. 分析用戶輸入的標籤列表到單個標籤
  2. 遍歷標籤...

    一個。如果存在標籤,則將其添加到對象的標籤集合

    b。否則,創建一個新的標籤,並把它添加到對象的標籤集合

  3. 堅持對象

您需要添加邏輯來尋找考慮到拼寫錯誤,大小寫和替換的使用現有的標籤。例如,你不想讓標籤意味着它們是同一個東西,但它們不是相同的字符串,比如「ASPNET」或「ASP.NET」或「asp.net」。您的標籤列表的質量將取決於檢查現有標籤的代碼的健壯程度。

0

只是爲了澄清 - 標籤可以固定在許多對象上,而對象可以有許多標籤。這就是多對多關係對我意味着什麼。這是你的意思嗎?

當你這樣做在SQL中,有一個名爲TAG和對象,這包含兩列,一爲其他表中的每個主鍵連接表命名TAG_OBJECT表。 TAG_OBJECT連接表中的主鍵是一對(TAG_ID,OBJECT_ID)。這保證了每行的唯一配對。

如果您在使用Hibernate,你只需要添加對象的列表或集合作爲一個私有數據成員到你的標籤類,並作爲私有數據成員的對象類標籤的列表或集合。

我覺得Hibernate將處理您的「只有當它不存在」,只要你寫了一個很好的方法來確定標籤的兩個實例之間的「深度平等」。

您還應該爲標記標題屬性添加一個唯一約束。下面是一個並不完全適合您的需求的例子,因爲它是Java和XML,但也許這暗示就足以告訴你在哪裏找的NHibernate:

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

對於你的情況,該列將是標記標題,類型是字符串,其他標誌保持原樣,如示例中所示。

+0

是的,這就是我的意思。關係部分已經完成並正在工作,現在我正在嘗試使標記獨一無二。爲了進一步討論,假設我標記的對象是消息 - 它只是一種類型的實體。 – 2009-06-19 10:21:58

相關問題