Artigo do tipo Exemplos Práticos
Recursos especiais neste artigo:
Contém nota quickupdate
Acesso a dados com NHibernate:
O acesso e persistência de dados é uma tarefa trivial para quase todo sistema corporativo e por este motivo existem diversas formas de realização desta tarefa.No mundo .NET a forma mais comum é o acesso a dados através do ADO.NET, que nos possibilita interagir diretamente com diversas fontes de dados, além de nos permitir executar códigos SQL nestas fontes a fim de recuperarmos ou persistirmos alguma informação. Em paralelo ao acesso nativo via ADO.NET, temos os frameworks ORM que nos permitem mapear as estruturas de nossas bases de dados para os objetos de nossa aplicação. É neste ponto que entra o NHibernate, um dos frameworks mais utilizados no mundo .NET. O NHibernate nos permite criar uma camada de mapeamento entre nossa aplicação e nossa base de dados, fazendo com que possamos abstrair o acesso à mesma, nos preocupando mais com nosso modelo de objetos. O NHibernate realiza uma leitura desta camada de mapeamento e gera todas as instruções SQL necessárias para interação com a base de dados. Neste artigo conheceremos os principais conceitos por trás do NHibernate, conhecendo os objetos SessionFactory e Session, explicando como podemos realizar a configuração do mesmo assim como o mapeamento básico de nossos objetos e recuperação dos mesmos.


Em que situação o tema é útil

Este tema é útil a qualquer equipe que atue em projetos que têm a necessidade de acessar ou persistir dados em um SGBD relacional, possibilitando que o desenvolvedor ganhe produtividade e facilidade de manutenção em suas aplicações.

O NHibernate é um framework ORM que facilita a interação da aplicação com o SGBD abstraindo toda a camada de acesso ao mesmo, permitindo que nos preocupemos mais com o domínio e com as regras de negócio de nossa aplicação.

Figura 1. Arquitetura do NHibernate

Na Figura 1 podemos observar a arquitetura do NHibernate. Na primeira camada, chamada application, temos a representação da nossa aplicação. Nele temos nossas classes de domínio que serão mapeadas para o SGBD. É nesta camada que teremos também o mapeamento destas classes, que será passado para o NHibernate. Vale ressaltar que esta figura representa a arquitetura do NHibernate e não da aplicação que consome ele, por este motivo a aplicação está concentrada em apenas um bloco. Em um cenário real, teríamos N camadas lógicas na nossa aplicação.

Na segunda camada, de cor laranja, temos a representação do NHibernate, com suas classes de gerenciamento de sessão e conexão. Nesta camada é interessante notar que o NHibernate não acessa diretamente a base de dados, mas faz uso da terceira camada para isso.

Esta terceira camada, representa as abstrações de acesso a dados do .NET. Ou seja, o NHibernate faz uso destas interfaces do ADO.NET para se comunicar com a base de dados. Sendo assim, qualquer SGBD que tenha uma implementação para o ADO.NET poderá ser utilizado com o NHibernate.

Por fim, na quarta camada temos o database de fato, onde os dados serão persistidos.

ISessionFactory – Classe responsável por criar as sessões (ISession) do NHibernate e manter o mapeamento das classes em memória. É responsável também pelo cache de segundo nível do mesmo, onde conseguimos armazenar objetos na memória da aplicação no nível da SessionFactory. Este é o objeto mais caro do NHibernate e por este motivo é altamente recomendável que tenhamos apenas uma instância do mesmo em nossa aplicação.

ISession – Classe responsável por gerenciara comunicação entre a aplicação e a base de dados. É ela quem encapsula uma conexão com o ADO.NET connection, fornecendo métodos para persistência e manipulação de objetos, além de gerenciamento de transações com a base de dados. Nela fica o cache de primeiro nível do NHibernate.

ITransaction – Classe responsável por abstrair a ADO.NET Transaction, possibilitando o uso de transações atômicas para realização de operações na base de dados, garantindo que onde todas as operações sejam executadas ou canceladas, não havendo execução parcial das mesmas.

IConnectionProvider – Classe interna do NHibernate que serve como factory para ADO.NET connections e Commands. O Objetivo dela é abstrair as implementações concretas das interfaces IDBConnection e IDBCommand.

IDriver – Classe que encapsula as diferenças entre os providers ADO.NET, como convenções para nomes de parâmetros e recursos suportados por cada base de dados.

TransactionFactory – Classe interna do NHibernate para criação de transações.

Entendendo as configurações do NHibernate

Devido à abstração de diversas bases de dados, o NHibernate nos fornece a possibilidade de configurar quase tudo na nossa conexão e persistência de dados.

A configuração inicial é realizada através do objeto NHibernate.Cfg.Configuration,sendo este objeto o responsável por criar uma instância de ISessionFactory

Estas configurações podem ser definidas diretamente no web.config (Listagem 1) ou em um arquivo padrão de configuração do NHibernate (Listagem 2).

Listagem 1. Exemplo de configuração no Web.Config


  01     <configuration>
  02       <configSections>
  03         <section name="hibernate-configuration"
              type="NHibernate.Cfg.ConfigurationSectionHandler, 
              NHibernate" />
  04       </configSections>
  05       <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  06         <session-factory>
  07           <property  name="connection.provider">
               NHibernate.Connection.DriverConnectionProvider</property>
  08           <property name="connection.driver_class">
                NHibernate.Driver.MySqlDataDriver</property>
  09           <property name="dialect">NHibernate.Dialect.
                MySQL5Dialect</property>
  10           <property name="hbm2ddl.auto">none</property>
  11           <property name="connection.connection_string">
  12             Database=my_database_easy_29;
  13             Data Source=LOCALHOST;
  14             User Id=root;
  15             Password=devmedia;
  16           </property>
  17         </session-factory>
  18       </hibernate-configuration>
  19     </configuration>

Listagem 2. Exemplo de configuração no NHibernate.cfg.xml


  01     <?xml version="1.0" encoding="utf-8"?>
  02     <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  03       <session-factory>
  04         <property  name="connection.provider">
              NHibernate.Connection.DriverConnectionProvider</property>
  05         <property name="connection.driver_class">
              NHibernate.Driver.MySqlDataDriver</property>
  06         <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
  07         <property name="hbm2ddl.auto">none</property>
  08         <property name="connection.connection_string">
  09           Database=my_database_easy_29;
  10           Data Source=LOCALHOST;
  11           User Id=root;
  12           Password=devmedia;
  13         </property>
  14       </session-factory>
  15     </hibernate-configuration> ... 

Quer ler esse conteúdo completo? Tenha acesso completo