代码之家  ›  专栏  ›  技术社区  ›  Michał Chaniewski

NHibernate-如何执行唯一性?

  •  1
  • Michał Chaniewski  · 技术社区  · 15 年前

    我的设想如下:

    • 我有一些可以标记的对象(消息)
    • 所以我有一个标记实体和多对多关系
    • 上述操作已完成,并且正在运行
    • 如果标签已经存在,我希望它被识别并附加到我的对象上,而不是一个新的

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

    谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jamie Ide    15 年前

    您可以在业务类中表达多对多关系,并与NHibernate进行映射。解析多对多关系的链接表的结构将防止对象多次链接到同一标记。

    在你的问题中执行规则的唯一方法是通过代码。任务的顺序类似于:

    1. 将用户输入的标记列表解析为单个标记
    2. A.如果存在标记,则将其添加到对象的标记集合中

      B否则,创建一个新标记并将其添加到对象的标记集合中

    考虑到拼写错误、大写和其他用法,您需要添加逻辑来查找现有标记。例如,您不希望有表示相同内容但不等于字符串的标记,例如“ASPNET”或“ASP.NET”或“ASP.NET”。标记列表的质量取决于检查现有标记的代码的健壮性。

        2
  •  0
  •   duffymo    15 年前

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

    在SQL中执行此操作时,会有名为TAG和OBJECT的表以及名为TAG_OBJECT的联接表,其中包含两列,其他表中的每个主键对应一列。TAG_对象联接表中的主键是该对(TAG_ID,OBJECT_ID)。这保证了每一行都有一个唯一的配对。

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

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

    对于您的情况,该列将是标记标题,类型为string,其他标志保持与示例中的相同。