Introduçã a Persistência de dados com NHibernate

Na maioria das vezes, as aplicações que são desenvolvidas tem uma necessidade de armazenar os dados que são gerados por elas em um banco de dados relacional. Por essa necessidade as aplicações utilizam os sistemas de gerenciamento de banco de dados (SGBD) para armazenar, modificar e extrair informações. Há mais de um tipo de SGBD no mercado, eles utilizam uma linguagem de pesquisa relacional padrão que é a Structured Query Language (SQL), mas cada um pode possuir seus próprios comandos para manipular os dados.

A maioria dos SGBDs tem objetos que são utilizados para criar blocos de códigos SQL para realizar um determinado procedimento, isso possibilita ao desenvolvedor colocar regras de negocio dentro desses blocos. Uma das evoluções em construir softwares é a construção em camadas e um modelo padrão de arquitetura para sistemas é o modelo em 3 camadas, a camada de apresentação que interage com o usuário, a camada de negócio que ficam as funções e regras do negócio e a camada de dados que é responsável em persistir os dados.

Uma desvantagem em desenvolver diretamente com o SGBD é que os códigos de persistência são repetitivos e consomem muito tempo do desenvolvedor, tempo esse que deveria ser utilizado para desenvolver outras atividades. Outra desvantagem é que a aplicação não tem a facilidade de trocar seu repositório, sendo que podem existir códigos de regra de negócio junto com códigos de persistência.

Uma boa solução é utilizar um framework de persistência, que gerencia e mapeia o banco de dados e os objetos da aplicação. Algumas vantagens estão em não escrever os códigos SQL e desvincular a aplicação de um SGBD, facilitando assim a troca de um repositório por outro.

O NHibernate é um framework de persistência open-source que vem do Hibernate para Java, que foi um dos primeiros ORMs do mercado. Ele foi desenvolvido para ser utilizado em projetos que utilizam o .NET Framework 3.5 ou Framework 4.0 da Microsoft, que é base de desenvolvimento da linguagem C#.

Nas próximas seções deste trabalho são apresentados, de maneira mais detalhada, como NHibernate ajudou no desenvolvimento de uma aplicação na empresa Spinup.

SGBD

Sistema gerenciador de banco de dados(SGBD) é um gerenciador computadorizado de registros. Um banco de dados em si pode ser comparado a um estoque, onde uma coleção de arquivos de dados computadorizados são guardados conforme a necessidade da aplicação (Date;Vieira;Lifschitz, 2004).

A funções básicas de um SGBD são:

  • Criar banco de dados.
  • Criar elementos no banco de dados.
  • Inserir, alterar, excluir e consultar dados no banco de dados.
  • Garantia a integridade dos dados.
  • Segurança de acesso e na consistência dos dados.
  • Gerenciar transações.

Persistência de dados

Persistência de dados é a gravação de dados em um dispositivo físico, sendo um armazenamento não volátil, onde os dados não serão perdidos e podem ser recuperados em qualquer momento.

Para persistir os dados em um banco de dados relacional é utilizada a linguagem SQL, que é a linguagem padrão nos sistemas gerenciadores de banco de dados. Outro jeito de persistir os dados é utilizando um banco de dados orientado a objetos, que tem seus pilares em herança, polimorfismo e encapsulamento, com maior flexibilidade na manipulação de seus objetos. Nesse tipo não é utilizada a linguagem padrão SQL (Boscarioli;Bezerra;Benedicto;Delmiro, 2013).

Framework

Framework é uma biblioteca de classes que oferecem uma funcionalidade, é baseada em extensão de objetos, técnicas de reaproveitamento, compreendendo tanto designer quanto código (Fayad;Schimidt, 1997).

O Framework tenta capturar o fluxo de controle de uma aplicação dentro de um domínio, este fluxo pode ser explorado por uma aplicação específica, eles são adaptáveis por customização e extensão da estrutura que eles provêm.

Framework de Persistência

Framework de Persistência faz o trabalho de persistir os objetos em um repositório, separando regras de negócio da persistência, buscando assim facilidades em inserir, consultar, alterar e excluir dados (Natalli; Menezes, 2013). Geralmente é escrito para trabalhar em conjunto com um banco de dados relacional ou uma API, para serviços de dados orientados a registros.

Frameworks de persistência são desenvolvidos tendo como alvo o conceito de software orientado a objetos.

Tal framework definirá o particionamento e organização da aplicação em classes e objetos instanciados a partir delas, bem como o fluxo de dados e controle.

ORM

ORM (Object-Relational Mapping, ou Mapeamento Objeto Relacional) é uma técnica que faz com que as tabelas do banco de dados sejam representadas por classes, e seus registros por instâncias das classes (Silva, 2013).

Com isso, o programador não precisa escrever código SQL, utilizando a própria interface do framework para realizar toda a persistência dos dados.

Por realizar esse mapeamento, sem a necessidade de escrever SQL, escrito e configurado de forma correta, o mesmo software pode trabalhar com diferentes bases de dados, sem a necessidade de alterar o código.

Hibernate

O Hibernate é uma soluçâo de mapeamento objeto relacional, sendo reconhecido por desenvolvedores Java (BAUER; KING, 2007).

Ele não apresenta apenas a função de mapeamento de ojeto relacional, também disponibiliza um mecanismo de consulta. Com isso obtem-se um ganho maior no desenvolvimento da aplicação.

Para seu uso é necessário que cada elemento da tabela do banco de dados tenha uma classe Java que a represente.

As instâncias dessas classes são persistidas pelo Hibernate no banco através da identificação do arquivo XML.

Caso haja a necessidade de alteração do banco de dados, basta fazer alteração do driver e alterar a configuração no arquivo XML do hibernate.

NHibernate

O Nhibernate é uma solução para plataforma .NET, ele lida com plano de persistência, gerando um XML contendo suas entidades e relacionamentos. Para objetos de dados relacionais, ele gera o código SQL para carregar e guardar os objetos (Dourado, 2013).

Suporta persistência transparente e os objetos da classe não tem que seguir um modelo de programação restritiva.

As classes persistentes não precisam implementar nenhuma interface ou herdar de uma classe especial base. Isto torna possível desenvolver a lógica empresarial utilizando o plano de objetos .NET.

O NHibernate contém três interfaces principais:

  • ISession: representa a conexão com o banco de dados;
  • ITransaction: representa a transação controlada pelo NHibernate;
  • IQuery: representa a consulta à base de dados.

Estudo de Caso

A spin-up Desenvolvimento de Sistema foi criada para atuar no mercado de desenvolvimento de software sob encomenda, com foco no desenvolvimento de aplicações de gravação de voz e monitoração telefônica.

MonitorRercorderTelephonic

O MonitorRecorderTelephonic é um sistema telefônico desenvolvido na linguagem C# da Microsoft, dividido em dois módulos.

  • Gravador Telefônico - É um gravador seletivo de chamadas telefônicas que passam através de troncos ou ramais de um Call Center, PABX Corporativo, ou mesa financeira. As gravações são feitas com base em regras de gravação criadas pelos usuários e administradores, que definem as características das chamadas que precisam ser gravadas. As chamadas são gravadas em Stereo e em formato similar ao MP3, e pode ser reproduzido em programas como o Windows Media Player ou o Winamp. Armazena os dados da chamada em um banco de dados PostgreSQL e o backup das chamadas é realizado em DVD.
  • Monitoração PABX Coral - Aplicação responsável por coletar e tratar as informações dos grupos de atendimento da central Tadiran Coral. Aplicação crítica para coleta e tratamento dos eventos de telefonia, a indisponibilidade deste aplicativo impacta diretamente nos relatórios e monitoração em tempo real. Armazena os dados históricos e de tempo real em um banco de dados SQL Server Express e o backup deste banco de dados é feito diariamente e o arquivo de backup é disponibilizado em um diretório local do servidor.

Veja também ;)

  • Curso Completo de Python:
    Neste curso de Python você aprenderá: - Operadores, estruturas condicionais, estruturas de repetição - CGI (criação de programas no lado do servidor web) - Programação orientada a objetos - Interfaces gráficas - tratamento de exceção - criação de jogos - E muitos mais.
  • Os Melhores Cursos de PHP:
    Aprenda a programar em PHP utilizando as melhores práticas e frameworks do mercado. Desenvolva aplicações com MVC, Composer, Laravel, CodeIgniter e o que há de mais moderno no mundo PHP.
  • Curso de Xamarin:
    O Xamarin é uma plataforma para desenvolvimento de aplicações móveis dentro da plataforma .NET, utilizando o C#. A grande vantagem dessa plataforma é a possibilidade de compartilhar código entre as muitas plataformas - iOS, Android e Windows - enquanto mantém-se a criação de aplicações nativas, tanto em performance como em interfaces.

Esses módulos são executados em servidores separados, o processo de gravação telefônica não tinha a informação exata quando a ligação foi terminada, com isso a duração era calculada pela data do arquivo de áudio que era salva em uma pasta do servidor. Um Serviço Windows fica monitorando a pasta para saber se tinha um novo arquivo e com o nome do arquivo comparava com o registro que já estava gravado no banco de dados. Com o módulo de monitoração do PABX Coral, esse procedimento foi trocado por outro mais eficiente, que era a geração de bilhete do PABX, que são dados que são enviados por ele quando uma ligação é finalizada. Quando esse bilhete é recebido por esse módulo, ele dispara um evento que grava no repositório do módulo de gravação telefônica, por isso a necessidade de ter uma camada de persistência mais eficiente e de fácil mudança. O crescimento do volume de dados é uma realidade no gravador de telefônico, sendo assim, a troca para um banco de dados mais robusto era uma necessidade dessa solução. A área de desenvolvimento tinha que ter a flexibilidade e rapidez na troca de um repositório por outro.

As imagens a seguir mostram a arquitetura dos módulos.

Arquitetura do módulo Gravador Telefônico
Figura 1: Arquitetura do módulo Gravador Telefônico
Arquitetura do módulo Monitoração PABX Coral
Figura 2: Arquitetura do módulo Monitoração PABX Coral

Características da solução com NHibernate

A implementação de um framework de persistência começou com a escolha de um produto que estivesse no mercado por algum tempo e o aprendizado deveria ser rápido e sem um custo elevado. Caso houvesse a necessidade de um curso para o grupo de desenvolvedores, essa solução deveria também estar já algum tempo no mercado e já tivesse sido usada em algum projeto conhecido por alguém da área de desenvolvimento da Spinup. Essa exigência seria pelo motivo de a solução da empresa já estar em produção nos clientes e caso houvesse alguma falha, os prejuízos seriam grandes para a empresa e seus clientes.

A primeira solução indicada foi o Entity Framework da Microsoft, como já estava incluso no Visual Studio e havia uma grande facilidade em encontrar material de estudo na internet, o aprendizado poderia se dar em pequeno espaço de tempo. Essa solução era a mais indicada porque os desenvolvedores já tinham uma grande experiência em desenvolver em produtos da Microsoft e tinham uma grande pressão por parte desses em utilizar somente produtos dessa empresa.

A outra solução indicada seria o NHibernate que é open source, é uma versão do Hibernate para a plataforma Microsoft .NET. Já encontrava-se mais tempo no mercado do que o Entity Framework e muita gente já o usavam em seus projetos.

Por fim, foi decido que o NHibernate seria o framework de persistência padrão nos próximos projetos, por ser uma solução que já estava há um tempo no mercado e vinha de um produto que era o Hibernate, que já era muito utilizado entre os desenvolvedores Java. Uma pessoa foi responsável em estudar sobre a solução e repassar o conhecimento para o restante do pessoal da equipe.

A primeira etapa do projeto era mapear as tabelas do banco de dados SQL Server e do PostgreSQL. Para gerar os arquivos de mapeamento e das entidades foi usado o software MyGeneration, que também é uma solução open source.

As próximas figuras mostram o software que gera os arquivos e o que foi gerado por ele.

Software para gerar arquivos de mapeamento e entidade
Figura 3: Software para gerar arquivos de mapeamento e entidade. Fonte: http://www.mygenerationsoftware.com
Diagrama de Relacionamento de entidade
Figura 4: Diagrama de Relacionamento de entidade
Arquivos que foram gerados pelo software MyGeneration
Figura 5: Arquivos que foram gerados pelo software MyGeneration
Conteúdo do arquivo Agente.cs
Figura 6: Conteúdo do arquivo Agente.cs

Listagem 1:Conteúdo do arquivo Agente.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <!--Build: with lujan99@usa.net NHibernate template-->
    <class name="Monitor.Agente,Monitor" table="Agente" lazy="true">
        <id name="Id" column="Id" type="Integer">
            <generator class="native"/>
            <property name="Nome" column="Nome" type="String"/>
            <property name="Ramal" column="Ramal" type="String"/>
            <many-to-one name="Grupo" column="IdGrupo" cascade="save-update" not-null="true"/>
        </id>
    </class>
<hibernate-mapping>

A segunda etapa do projeto foi construir a camada de persistência com NHibernate, construindo a classe que teria todas os métodos de inserir, excluir, alterar e consultar das tabelas dos módulos da solução telefônica.

Foi criada uma classe facade que é um objeto que expõe métodos mais simplificados para serem usados em outras classes. Todos os objetos que tem que ser criados no NHibernate foram criados dentro dela.

A seguir são citadas as classes que foram construídas na camada de persistência.

Gravador Telefônico: FacadeGravador; ChamadaDAO; BackupDAO; RamalDAO; RegraDAO.

Monitoração PABX Coral: FacadeMonitor; ChamadaDAO ;GrupoDAO; AgenteDAO; StatusDAO; StatusAgenteDAO.

A figura 7 e a listagem 2 mostram como foi construída a camada de persistência.

Diagrama de classe da camada de persistência
Figura 7: Diagrama de classe da camada de persistência

Listagem 2: Conteúdo da classe FacadeGravador

using System;
using System.Collections.Generic;
using system.Web;
using NHibernate;
using NHibernate.Cfg;

namespace Gravador
{
    public class FacadeGravador : IFacadeGravador
    {
        private ISession oSession;
        ITransaction oTransaction;
        IsessionFactory _sessionFactory;
        
        private ISessionFactory SessionFactory{
            get{
                Configuration configuration = new Configuration()
                configuration.Configure();
                configuration.AddAssembly(typeof(Chamada).Assembly);
                configuration.AddAssembly(typeof(Backup).Assembly);
                _sessionFactory = configuration.BuildSessionFactory();
                
                return _sessionFActory;
            }           
        }
        
        public void OpenSession{
            oSession = SessionFactory.OpenSession();
        }
        
        public void CloseSession(){
            SessionFactory.Close();
        }
        
        public void BeginTransaction(){
            oTransaction = oSession.BeginTransaction();
        }
        
        public void CommitTransaction(){
            oTransaction.Commit();
        }
        
        public void RollbackTransaction(){
            oTransaction.Rollback();
        }
        
        public void ChamadaAdd(Chamada chamada){
            oSession.Save(chamada);
        }
    }
}

Resultados alcançados utilizando NHibernate

O uso do NHibernate pela área de desenvolvimento da empresa Spinup proporcionou flexibilidade no uso de banco de dados e agilidade em criar repositórios para as aplicações. O objetivo foi alcançado em construir uma forma de persistir os dados em um repositório com as características de uma linguagem orientada a objetos e que a construção da lógica de banco de dados não ficasse responsável para a equipe de desenvolvimento. Abaixo são citados os benefícios no uso de um framework de persistência:

  • Agilidade no desenvolvimento
  • Padrão na camada de persistência
  • Flexibilidade em trocar o banco de dados
  • Regras de negocio fora da camada de persistência
  • Equipe focada nas regras de negocio
  • Custo reduzido pelo tempo reduzido em desenvolver comandos SQL.

A utilização de um framework de persistência no desenvolvimento de sistemas proporciona qualidade, agilidade e flexibilidade, removendo a complexidade na criação dos objetos do banco de dados relacional (Alonso;Ciferri, 2013).

Conclusão

Com a utilização do framework de persistência, se tem uma facilidade para gerenciar os dados no banco de dados, separando regras de negócios e persistência.

Neste estudo de caso proposto utilizamos o framework NHibernate, onde foram mapeadas as tabelas dos bancos de dados SQL Server e Postgree, definindo assim a camada de persistência. Com isso, houve uma redução considerável do tempo de implementação do sistema na Spinup e menor erro na codificação. E neste caso um foco maior na regra de negócio.

Conforme apresentado na seção 3.3, o uso do NHibernate trouxe maior agilidade aos processos e regras de negócio.

Referências sobre NHibernate

Links Úteis

  • Web API RESTful com N:N utilizando Jersey e Hibernate:
    Aprenda a implementar uma Web API RESTful em sistemas que possuam relacionamentos N:N, isto é, do tipo muitos para muitos, no banco de dados. Neste curso veremos como realizar o mapeamento objeto-relacional para que o framework ORM - Hibernate, por exemplo - saiba como lidar com esse tipo relacionamento.
  • O que é LESS?:
    Neste curso aprenderemos o que é o LESS, um pré-processador de CSS que nos permite escrever folhas de estilo usando uma sintaxe robusta, que conta com recursos como variáveis e funções, mas que é convertida posteriormente para CSS.
  • Introdução à Computação Serverless com Azure e .NET:
    Esse artigo é útil para quem deseja adentrar no mundo da computação serverless. Conheça uma das mais novas e promissoras áreas da computação que visa prover a execução de rotinas de software rápidas e baratas na nuvem, alocando o mínimo de recursos possíveis se, e somente se, requisições forem solicitadas ao servidor.

Saiba mais sobre .NET ;)

  • Guia Completo de Acesso a bancos de dados em .NET:
    Neste guia de consulta você encontrará diversos conteúdos sobre como acessar bancos de dados em aplicações .NET. Veja aqui como usar o Entity Framework e o NHibernate para bancos relacionais e como trabalhar com o MongoDB.
  • Curso de Entity Framework:
    O Entity Framework é hoje a principal ferramenta de Mapeamento Objeto-Relacional (ORM - Object-Relational Mapping) do universo .NET, ou seja, uma ferramenta que mapeia classes (objetos) em tabelas de banco de dados (relacional).
  • Como acessar o MongoDB com o C#:
    Neste curso veremos como conectar ao MongoDB a partir de uma aplicação C# e como realizar as operações de inserção, alteração, exclusão e listagem de documentos.