NHibernate: ¿cómo hacer cumplir la singularidad?
-
06-07-2019 - |
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!
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:
- Parse el usuario ingresó la lista de etiquetas en etiquetas individuales
-
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
-
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.