Pregunta

Mi escenario es el siguiente:

  • Tengo algunos objetos (mensajes) que se pueden etiquetar
  • Entonces tengo una entidad Tag y una relación de muchos a muchos
  • Lo anterior está hecho y funcionando
  • Ahora, al etiquetar, me gustaría guardar nuevas etiquetas solo si no existen (donde la existencia está marcada por el título de la etiqueta)
  • si la etiqueta ya existe, me gustaría que se reconozca y se adjunte a mi objeto en lugar de uno nuevo

¿Cuál es la forma más fácil / limpia de hacerlo?

Por cierto, por algunas razones me gustaría usar la clave primaria artificial (Id numérico) para mi entidad de etiqueta.

¡Gracias!

¿Fue útil?

Solución

Tiene una relación de muchos a muchos que puede expresar en sus clases de negocios y mapear con NHibernate. La estructura de la tabla de enlaces que resuelve la relación de muchos a muchos evitará que un objeto se vincule a la misma etiqueta más de una vez.

La única forma de hacer cumplir la regla en su pregunta es a través del código. La secuencia de tareas sería algo así como:

  1. Parse el usuario ingresó la lista de etiquetas en etiquetas individuales
  2. Recorrer las etiquetas ...

    a. Si existe una etiqueta, agréguela a la colección de etiquetas del objeto

    b. De lo contrario, cree una nueva etiqueta y agréguela a la colección de etiquetas del objeto

  3. Objeto persistente

Deberá agregar lógica para buscar etiquetas existentes teniendo en cuenta los errores ortográficos, las mayúsculas y el uso alternativo. Por ejemplo, no desea tener etiquetas que signifiquen lo mismo pero no sean cadenas iguales, como "ASPNET" o "ASP.NET" o "asp.net". La calidad de su lista de etiquetas dependerá de cuán robusto sea el código que verifica las etiquetas existentes.

Otros consejos

Solo para aclarar: una etiqueta se puede fijar en muchos objetos, y un objeto puede tener muchas etiquetas. Eso es lo que una relación de muchos a muchos significa para mí. ¿Es así como lo dices en serio?

Cuando hace esto en SQL, tiene tablas llamadas TAG y OBJECT y una tabla de unión llamada TAG_OBJECT que contiene dos columnas, una para cada clave primaria en las otras tablas. La clave principal en la tabla de unión TAG_OBJECT es el par (TAG_ID, OBJECT_ID). Eso garantiza un emparejamiento único para cada fila.

Si está utilizando Hibernate, simplemente agrega una lista o colección de Objetos como miembro de datos privados a su clase de Etiqueta, y una lista o colección de Etiquetas como miembro de datos privados a su clase de Objeto.

Creo que Hibernate manejará su " solo si no existe " ;, siempre y cuando escriba un buen método para determinar " igualdad profunda " entre dos instancias de etiqueta.

También debe agregar una restricción única al atributo de título de la etiqueta. Aquí hay un ejemplo que no se ajusta a tus necesidades, porque es Java y XML, pero tal vez esa pista sea suficiente para decirte dónde buscar NHibernate:

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

Para su caso, la columna será el título de la etiqueta, el tipo es cadena y las otras banderas permanecerán como están en el ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top