我的场景如下:

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

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

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

谢谢!

有帮助吗?

解决方案

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

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

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

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

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

  3. 持久化对象

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

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top