Domanda

Il mio scenario è il seguente:

  • Ho alcuni oggetti (Messaggi) che possono essere taggati
  • Quindi ho un'entità Tag e una relazione molti-a-molti
  • Quanto sopra è fatto e funzionante
  • Ora, quando taggo, vorrei salvare i nuovi tag solo se non esistono (dove l'esistenza è controllata dal titolo del tag)
  • se il tag esiste già, mi piacerebbe che fosse riconosciuto e associato al mio oggetto anziché a uno nuovo

Qual è il modo più semplice / pulito per farlo?

A proposito, per alcuni motivi mi piacerebbe usare la chiave primaria artificiale (ID numerico) per la mia entità Tag.

Grazie!

È stato utile?

Soluzione

Hai una relazione molti-a-molti che puoi esprimere nelle tue classi aziendali e mappare con NHibernate. La struttura della tabella di collegamento che risolve la relazione molti-a impedirà a un oggetto di essere collegato allo stesso tag più di una volta.

L'unico modo per applicare la regola nella tua domanda è tramite il codice. La sequenza di attività sarebbe simile a:

  1. Analizza l'elenco di tag immesso dall'utente in singoli tag
  2. Passa attraverso i tag ...

    a. Se esiste un tag, aggiungilo alla raccolta di tag dell'oggetto

    b. Altrimenti crea un nuovo tag e aggiungilo alla raccolta di tag dell'oggetto

  3. Oggetto persistente

Dovrai aggiungere la logica per cercare i tag esistenti tenendo conto degli errori di ortografia, delle maiuscole e dell'uso alternativo. Ad esempio, non vuoi avere tag che significano la stessa cosa, ma non sono stringhe uguali, come " ASPNET " o " ASP.NET " o " asp.net " ;. La qualità dell'elenco dei tag dipenderà dalla robustezza del codice che controlla i tag esistenti.

Altri suggerimenti

Giusto per chiarire: un tag può essere bloccato su molti oggetti e un oggetto può avere molti tag. Ecco cosa significa per me una relazione molti-a-molti. È così che intendi?

Quando si esegue questa operazione in SQL, sono presenti tabelle denominate TAG e OBJECT e una tabella di join denominata TAG_OBJECT che contiene due colonne, una per ogni chiave primaria nelle altre tabelle. La chiave primaria nella tabella di join TAG_OBJECT è la coppia (TAG_ID, OBJECT_ID). Ciò garantisce un'associazione unica per ogni riga.

Se si utilizza Hibernate, è sufficiente aggiungere un elenco o una raccolta di oggetti come membro di dati privati ??alla classe Tag e un elenco o una raccolta di tag come membro di dati privati ??alla classe Object.

Penso che Hibernate gestirà il tuo "solo se non esiste", purché tu scriva un buon metodo per determinare "l'uguaglianza profonda" tra due istanze di Tag.

Dovresti anche aggiungere un vincolo univoco all'attributo titolo tag. Ecco un esempio che non si adatta perfettamente alle tue esigenze, perché è Java e XML, ma forse quel suggerimento sarà sufficiente per dirti dove cercare NHibernate:

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

Nel tuo caso, la colonna sarà il titolo del tag, type è stringa e gli altri flag rimangono come nell'esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top