Question

Mon scénario est le suivant:

  • j'ai des objets (messages) qui peuvent être étiquetés
  • J'ai donc une entité Tag et une relation plusieurs à plusieurs
  • Ce qui précède est fait et fonctionne
  • Maintenant, lors du marquage, je voudrais enregistrer les nouvelles balises uniquement si elles n'existent pas (où l'existence est vérifiée par le titre de la balise)
  • si le tag existe déjà, j'aimerais qu'il soit reconnu et attaché à mon objet au lieu d'un nouvel

Quel est le moyen le plus simple et le plus propre de le faire?

BTW, pour certaines raisons, j'aimerais utiliser une clé primaire artificielle (identificateur numérique) pour mon entité de balise.

Merci!

Était-ce utile?

La solution

Vous avez une relation plusieurs à plusieurs que vous pouvez exprimer dans vos classes business et mapper avec NHibernate. La structure de la table de liens qui résout la relation plusieurs à plusieurs empêchera un objet d'être lié à la même balise plusieurs fois.

La seule façon d'appliquer la règle dans votre question consiste à utiliser du code. La séquence de tâches ressemblerait à quelque chose comme:

  1. Analyser la liste des balises saisies par l'utilisateur en balises individuelles
  2. Boucle entre les balises ...

    a. Si une balise existe, ajoutez-la à la collection de balises de l'objet

    b. Sinon, créez une nouvelle balise et ajoutez-la à la collection de balises de l'objet

  3. Objet persistant

Vous devrez ajouter une logique pour rechercher les balises existantes en tenant compte des fautes d'orthographe, de la capitalisation et des autres utilisations. Par exemple, vous ne souhaitez pas que les balises signifient la même chose mais ne soient pas des chaînes identiques, telles que "ASPNET". ou " ASP.NET " ou "asp.net". La qualité de votre liste de balises dépend de la robustesse du code vérifiant les balises existantes.

Autres conseils

Juste pour préciser, une balise peut être épinglée sur de nombreux objets, et un objet peut avoir plusieurs balises. C'est ce qu'une relation plusieurs-à-plusieurs signifie pour moi. Est-ce ce que vous voulez dire?

Lorsque vous faites cela en SQL, vous avez des tables nommées TAG et OBJECT et une table de jointure appelée TAG_OBJECT qui contient deux colonnes, une pour chaque clé primaire dans les autres tables. La clé primaire de la table de jointure TAG_OBJECT est la paire (TAG_ID, OBJECT_ID). Cela garantit un appariement unique pour chaque ligne.

Si vous utilisez Hibernate, vous ajoutez simplement une liste ou une collection d'objets en tant que membre de données privé à votre classe Tag, et une liste ou une collection de balises en tant que membre de données privé à votre classe Object.

Je pense qu'Hibernate ne traitera votre "que s'il n'existe pas" tant que vous écrivez une bonne méthode pour déterminer "l'égalité profonde". entre deux instances de Tag.

Vous devez également ajouter une contrainte unique à l'attribut title de la balise. Voici un exemple qui ne correspond pas tout à fait à vos besoins, car il s’agit de Java et XML, mais cet indice suffira peut-être à vous indiquer où rechercher NHibernate:

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

Dans votre cas, la colonne sera le titre de la balise, le type est une chaîne et les autres indicateurs restent tels qu'ils sont dans l'exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top