【问题标题】:NHibernate - how to enforce uniquenes?NHibernate - 如何强制执行唯一性?
【发布时间】:2009-06-19 10:06:40
【问题描述】:

我的场景如下:

  • 我有一些可以标记的对象(消息)
  • 所以我有一个 Tag 实体和多对多关系
  • 以上已完成并正在运行
  • 现在,在标记时,我想仅在新标签不存在时才保存新标签(通过标签标题检查存在)
  • 如果标签已经存在,我希望它能够被识别并附加到我的对象而不是新对象

最简单/最干净的方法是什么?

顺便说一句,出于某些原因,我想为我的标签实体使用人工主键(数字 ID)。

谢谢!

【问题讨论】:

    标签: nhibernate unique


    【解决方案1】:

    你有一个多对多的关系,你可以在你的业务类中表达它并用 NHibernate 映射。解析多对多关系的链接表结构将防止一个对象多次链接到同一个标签。

    在您的问题中强制执行规则的唯一方法是通过代码。任务顺序如下:

    1. 将用户输入的标签列表解析为单个标签
    2. 遍历标签...

      一个。如果存在标签,则将其添加到对象的标签集合中

      b.否则创建一个新标签并将其添加到对象的标签集合中

    3. 持久化对象

    您需要添加逻辑来查找现有标签,同时考虑到拼写错误、大小写和替代用法。例如,您不希望有表示它们相同但不等于字符串的标记,例如“ASPNET”或“ASP.NET”或“asp.net”。标签列表的质量将取决于检查现有标签的代码的健壮程度。

    【讨论】:

      【解决方案2】:

      澄清一下——一个标签可以固定在许多对象上,一个对象可以有很多标签。这就是多对多关系对我的意义。你是这个意思吗?

      当您在 SQL 中执行此操作时,您有一个名为 TAG 和 OBJECT 的表以及一个名为 TAG_OBJECT 的连接表,其中包含两列,一个用于其他表中的每个主键。 TAG_OBJECT 连接表中的主键是对 (TAG_ID, OBJECT_ID)。这保证了每一行的唯一配对。

      如果您使用 Hibernate,您只需将一个对象列表或集合作为私有数据成员添加到您的 Tag 类,并将一个标签列表或集合作为私有数据成员添加到您的 Object 类。

      我认为 Hibernate 将处理您的“仅当它不存在时”,只要您编写一个好的方法来确定两个 Tag 实例之间的“深度相等”。

      您还应该为标签标题属性添加一个唯一约束。这是一个不太适合您需求的示例,因为它是 Java 和 XML,但也许该提示足以告诉您在哪里寻找 NHibernate:

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

      对于您的情况,列将是标签标题,类型是字符串,其他标志保持与示例中的相同。

      【讨论】:

      • 是的,我就是这个意思。关系部分已经完成并且正在工作,现在我正在尝试使标签独一无二。为了进一步讨论,假设我标记的对象是消息——它只是一种实体。
      • 我认为 Hibernate 会解决这个问题。也许您需要在 title 属性上添加唯一约束。
      • 它的工作方式是,当唯一性被破坏时会引发异常。我可以处理这个,但我正在寻找一种更清洁的方法......
      • “更清洁”会是什么样子?这就是 Hibernate 的做法。如果您希望发生其他事情,则必须找到另一种技术。
      猜你喜欢
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多