Pergunta

Meu cenário é o seguinte:

  • Eu tenho alguns objetos (Mensagens), que pode ser marcado
  • Então, eu tenho uma entidade Tag e muitos-para-muitos relação
  • A descrição acima é feito e trabalhar
  • Agora, quando a marcação, eu gostaria de salvar novas tags somente se eles não existem (onde a existência é verificada por título tag)
  • Se a tag já existe, eu gostaria que ele seja reconhecido e ligado ao meu objeto em vez de um novo

O que é a maneira mais fácil / mais limpa de fazê-lo?

BTW, por algumas razões que eu gostaria de usar a chave primária artificial (Id numérico) para minha entidade Tag.

Obrigado!

Foi útil?

Solução

Você tem um relacionamento muitos-para-muitos que você pode expressar em suas classes de negócio e mapear com NHibernate. A estrutura da tabela ligando que resolve muitos-para-muitos irá impedir que um objeto de ser ligada à mesma etiqueta mais do que uma vez.

A única maneira de aplicar a regra na sua pergunta é através de código. A sequência de tarefas seria algo como:

  1. Parse entrou usuário lista de tags em tags individuais
  2. Curva através de tags ...

    a. Se uma tag existe em seguida, adicioná-lo à coleção de etiquetas do objeto

    b. Else criar uma nova etiqueta e adicioná-lo à coleção tag do objeto

  3. Persistir objeto

Você precisará adicionar lógica para olhar para marcas existentes tendo em conta erros de ortografia, capitalização e uso alternativo. Por exemplo, você não quer ter marcas que significa que eles mesma coisa, mas não são cadeias iguais, como "ASPNET" ou "ASP.NET" ou "asp.net". A qualidade da sua lista de tag vai depender de quão robusto o código que verifica a existência de marcas existentes é.

Outras dicas

Só para esclarecer - um Tag podem ser fixados em muitos objetos, e um objeto pode ter muitas tags. Isso é o que muitos-para-muitos meios de relacionamento para mim. É assim que você quer dizer isso?

Quando você fizer isso em SQL, você tem tabelas nomeadas TAG e o objeto e uma junção tabela chamada TAG_OBJECT que contém duas colunas, uma para cada chave primária nas outras mesas. A chave primária no TAG_OBJECT tabela de junção é o par (TAG_ID, OBJECT_ID). Que garante um emparelhamento exclusivo para cada linha.

Se você estiver usando Hibernate, você acabou de adicionar uma lista ou uma coleção de objetos como um membro de dados privado para sua classe Tag, e uma lista ou uma coleção de tags como um membro de dados privado para sua classe de objeto.

Eu acho que o Hibernate irá lidar com o seu "somente se ele não existe", contanto que você escrever um método bom para determinar "profunda igualdade" entre duas instâncias do Tag.

Você também deve adicionar uma restrição exclusiva para o atributo título tag. Aqui está um exemplo que não se encaixa às suas necessidades, porque é Java e XML, mas talvez essa dica será suficiente para lhe dizer onde procurar NHibernate:

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

Para o seu caso, a coluna será o título tag, tipo é corda, e as outras bandeiras permanecem como estão no exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top