Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvidas em relação à configuração do NHibernate

Bom dia! Segue algumas dúvidas com relação à primeira vídeo-aula:

1) Por que que para o arquivo de mapeamento (.hbm.xml) eu preciso configurar a propriedade "BuildAction" e não a "Copy to Output Directory" enquanto que o arquivo de configuração (hibernate.cfg.xml) foi configurado como "Copy Always"? Por que dessa diferença nas configurações?

2) Por que tenho que adicionar esse comando no arquivo de mapeamento? "xmlns="urn:nhibernate-mapping-2.2". E por que tem que ser a versão 2.2? Não pode ser outra versão? Como saber qual a versão utilizar?

1 resposta
solução!

Bom dia, Thiago. Tudo bom?

1) O arquivo .hbm.xml não é um arquivo de código compilável. Se mudamos sua BuildAction para Embedded Resource, o NHibernate saberá sempre como acessar este arquivo sem a necessidade de outras configurações adicionais.

Em produção, seu mapeamento será diferente? Muito possivelmente não! No mais, tornar o mapeamento diferente nos ambientes de produção/desenvolvimento/homologação é sinal de que você terá problemas com o projeto. Tornando a Build Action como Embedded Resource faz sentido porque o mapeamento não será alterado após você subir um pacote para produção - de qualquer modo, você pode configurar como Copy to output directory e fazer alterações no código para o NHibernate ler este arquivo do disco, em tempo de execução.

O arquivo de configuração cfg.xml, como o próprio nome diz, é de configuração! Então, de acordo com o ambiente de execução (seus clientes e seus ambientes de dev/homolog) as configurações, como a de driver, por exemplo, poderão ser diferentes! Então é bastante valioso manter isto fora da nossa DLL para que o pessoal de infra/operação possa alterar.

2) Em documentos XML, o atributo xmlns indica qual é o namespace a ser usado pelo documento. No caso, o namespace usado pelo documento é o urn:nhibernate-mapping-2.2. Um namespace XML pode ser definido tanto com uma URL (por exemplo, http://www.w3.org/1999/xhtml) quanto por uma URN. A URN é interessante quando você não pode oferecer uma URL acessível pela internet com a documentação à respeito do namespace.

Quando usamos um namespace, o leitor do documento XML sabe onde encontrar a especificação dos atributos e dos elementos do arquivo. Então hibernate-mapping, class, property, etc. não são elementos aleatórios! São todos elementos definidos dentro do namespace urn:nhibernate-mapping-2.2!

Outra forma de usar estes elementos é declarando um nome à este namespace como, por exemplo, com o atributo xmlns:meu_prefixo="urn:nhibernate-mapping-2.2"

Mas, perceba que agora não dizemos qual é o namespace do documento e sim qual é o namespace do prefixo meu_prefixo e, para usar estes elementos, precisaremos montar o XML com tags como:

<meu_prefixo:hibernate-mapping xmlns:meu_prefixo="urn:nhibernate-mapping-2.2">
    <meu_prefixo:class name="Usuario">
    </meu_prefixo:class>
</meu_prefixo:hibernate-mapping>

A versão da especificação usada no NHibernate atualmente é a 2.2 e você pode usar esta versão com segurança - versões de especificação são bem estáveis. Você saberá se houver uma nova especificação através do blog do NHibernate e, mesmo com uma nova versão, o código criado para o 2.2 continuará válido.

Tudo bem? Esclareci sua dúvida?