1

我的情况如下:

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

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

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

谢谢!

4

2 回答 2

1

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

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

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

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

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

  3. 持久化对象

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

于 2009-06-19T12:02:48.610 回答
0

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

当您在 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"/>

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

于 2009-06-19T10:19:11.583 回答