A principal crítica em cima do NHibernate, e também de outras ferramentas de mapeamento objeto-relacional, é a baixa qualidade da estrutura de tabelas e relacionamento que é criada. O que muita gente se esquece, é que não é o NHibernate que cria essa estrutura, é você que define como ela será criada, através dos arquivos de mapeamento. O fato é que, depois que o NHibernate cria a estrutura do banco, um DBA ou pessoa experiente em banco de dados relacional, deve analisar a estrutura criada e sugerir ou realizar prováveis melhorias. Mas existem algumas coisas que você já pode definir no mapeamento e evitar passar “vergonha” naquela reunião com o DBA. Sendo assim, dedicamos essa coluna a dar algumas dicas de boas práticas no mapeamento NHibernate, principalmente para a definição e criação de índices. Nomes das FKs Vamos começar resolvendo uma das maiores reclamações de DBAs, os nomes das FKs. Se você já deixou o NHibernate criar alguma estrutura de banco de dados, já deve ter ouvido essa reclamação: “Porque você criou uma FK chamada fk3172150e1cd5af92? Não dava pra criar com um nome melhor não?” A resposta é sim, e dá pra fazer isso de forma bem simples, veja a seguir:
<many-to-one name="Uf" column="ID_UF" class="UnidadeFederativa" cascade="none" lazy="false"
      foreign-key="fk_uf"/>

Índices

Outra reclamação recorrente é quanto aos índices. Alguns DBAs preferem criar eles mesmos este tipo de coisa, mas quando você sabe que vai precisar de um índice, é bom definir no próprio mapeamento. Se você quer criar um índice de uma única coluna, pode fazer assim:

<property name="Nome" column="NOME"  type="string" length="50" not-null="true" 
     index="idx_cidade_nome"/>
E se você quiser criar um índice entre duas ou mais colunas, basta repetir essa propriedade index nas colunas envolvidas, usando é claro o mesmo nome.

Chave Única

Chaves únicas também são características comuns da maioria dos bancos de dados, e que podemos definir de forma genérica no NHibernate. Se você quer definir uma coluna como chave única, pode fazer assim:


<property name="CodigoMunicipio" column="CODIGO" type="string" length="10" not-null="true"
   unique="true" />
Ou se você quiser definir uma chave única com a junção de duas ou mais colunas, também pode fazer assim:
<property name="Nome" column="NOME"  type="string" length="50" not-null="true" 
   unique-key="uk_CodigoNome" />
<property name="CodigoMunicipio" column="CODIGO" type="string" length="10" not-null="true"
   unique-key="uk_CodigoNome" />
Basicamente com essas dicas você é capaz de definir no próprio mapeamento NHibernate, como devem ser criados os índices no seu banco de dados. Na Listagem 1 você vê o mapeamento completo dos exemplos mostrados aqui.

Listagem 1. Mapeamento completo


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"                       
assembly="Dominio"  namespace=" Dominio.Entidades" >
 
<class name="Cidade" table="CIDADE" lazy="false">
             <id name="Id" column="ID_CIDADE" unsaved-value="0">               
                    <generator class="native"/>
             </id>
            
             <property name="Nome" column="NOME"  type="string" length="50" not-null="true" 
index="idx_cidade_nome"/>
             <property name="CodigoMunicipio" column="CODIGO" type="string" length="10"
not-null="true" unique="true" />       
             <many-to-one name="Uf" column="ID_UF" class="UnidadeFederativa" cascade="none"
lazy="false" foreign-key="fk_uf"/>
       </class>
 
</hibernate-mapping>