Clique aqui para ler esse artigo em PDF.imagem_pdf.jpg

img

Clique aqui para ler todos os artigos desta edição

Introdução ao NHibernate

 

O NHibernate é a versão para o .NET Framework de um dos mais utilizados componentes de mapeamento objeto-relacional (ORM) existentes no mundo J2EE, o Hibernate. Sua funcionalidade é mapear as entidades de negócio aos objetos de banco de dados existentes nas aplicações. Isto ocorre através da configuração de um arquivo no formato XML que faz, de forma automática, toda a tradução dos atributos de uma classe de negócio para os objetos de banco de dados em comandos SQL.

Neste artigo irei explicar como funciona esta ferramenta através de um exemplo prático que pode ser facilmente estendido para a maioria das aplicações.

NHibernate x Hibernate

Atualmente, o NHibernate encontra-se na versão 1.0.2 e pode ser utilizado tanto nos Frameworks 1.1 e 2.0 da plataforma .NET. Esta versão do NHibernate é equivalente à versão 2.1 do J2EE, e toda a documentação utilizada na versão J2EE pode ser aplicada diretamente para a versão do .NET.

Uma curiosidade é que após o lançamento oficial da versão 1.0 do NHibernate, a JBOSS, empresa responsável pelo Hibernate, comprou os direitos desta ferramenta, fazendo assim uma integração do conhecimento, usuários e plataforma para um modelo de persistência de dados padrão entre as tecnologias.

Se você acessar os sites www.hibernate.org e www.nhibernate.org notará que ambos compartilham da mesma estrutura. Algumas particularidades das versões podem ser encontradas no link: http://www.hibernate.org/360.html. Entretanto, a JBOSS vem trabalhando para tentar zerar todas as pendências.

Contribuições

O NHibernate possui seu código aberto e foi desenvolvido com a linguagem C#. Por conta disso, muitas funcionalidades foram desenvolvidas através das contribuições de diversos programadores. Isto ajuda e muito a tornar o NHibernate uma ferramenta padrão para a plataforma .NET. Estas contribuições funcionam como se fossem plug-ins para a versão atual.

Embora estas contribuições estejam fora do package oferecido pelo time do NHibernate, estas são aprovadas e listadas no próprio site da ferramenta.

Aplicação exemplo

Antes de começarmos a trabalhar com o NHibernate, deixe-me primeiro apresentar o modelo da aplicação exemplo que usaremos nesta matéria.  O sistema trata de um exemplo clássico de um sistema de vendas de uma loja, com produtos, pedidos, clientes, fornecedores e categorias de produtos.

A Figura 1 ilustra o modelo de classes de nossa aplicação. O modelo
está simples, em um formato bem acadêmico, de fácil entendimento. Nele, utilizei recursos de herança, composição, agregação e lista. Com este modelo posso mostrar os tipos de mapeamento mais utilizados no NHibernate, como one-to-many, many-to-one, many-to-many, bags etc.

Podemos ver na Figura 2 como ficou representado o modelo de classe em nosso banco de dados. Note que cada entidade é representada por uma tabela e cada atributo por um campo.

Arquitetura da Aplicação

A aplicação modelo será desenvolvida em três camadas, sendo elas:

·         Camada de interface: será representada por um projeto do tipo windows forms e conterá todos os formulários de nossa aplicação;

·         Camada de dados: projeto do tipo “Class Library” que irá conter as classes bases de acesso a dados. Esta classe irá criar um encapsulamento das funcionalidades do NHibernate. Isto nos dará uma flexibilidade maior caso queiramos substituir, no futuro, o NHibernate por qualquer outra forma de acesso a dados.

·         Camada de negócio: representará nossos objetos de negócio, ou seja, todas as classes definidas no diagrama de classe. Será um projeto do tipo “Class Library” e terá além das classes, um diretório chamado mapeamento onde colocaremos os arquivos de configuração xml de mapeamento para o NHibernate.

 

img

Figura 1. Modelo de classe da aplicação exemplo.

 

img

Figura 2. Representação das tabelas no banco de dados.

Configurando o banco de dados

Nossa aplicação utilizará o banco de dados SQL Server 2005 Express, que pode ser baixado gratuitamente no link http://www.microsoft.com/brasil/msdn/express/sql/default.aspx.

Esta ferramenta já foi apresentada em artigos anteriores. Dessa forma, tomarei com premissa que a execução do script seja algo simples de ser feito, não mostrando o passo-a-passo de como se chegar lá. A Listagem 1 contém o script necessário para criarmos o banco de dados da aplicação. Execute-o conforme mostra a Figura 3.

 

CREATE TABLE [dbo].[Categoria](

         [ID_categoria] [int] IDENTITY(1,1) NOT NULL,

         [nome] [varchar](250) NOT NULL,

 CONSTRAINT [PK_Categoria] PRIMARY KEY CLUSTERED

(

         [ID_categoria] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Pessoa](

         [ID_pessoa] [int] IDENTITY(1,1) NOT NULL,

         [nome] [varchar](250) NOT NULL,

         [endereco] [varchar](250) NOT NULL,

 CONSTRAINT [PK_Pessoa] PRIMARY KEY CLUSTERED

(

         [ID_pessoa] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Produto](

         [ID_produto] [int] IDENTITY(1,1) NOT NULL,

         [ID_fornecedor] [int] NOT NULL,

         [ID_categoria] [int] NOT NULL,

         [nome] [varchar](250) NOT NULL,

         [valor] [money] NOT NULL,

 CONSTRAINT [PK_Produto] PRIMARY KEY CLUSTERED

(

         [ID_produto] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Juridica](

         [ID_pessoa] [int] NOT NULL,

         [cgc] [varchar](25) NOT NULL,

         [ID_responsavel] [int] NOT NULL,

 CONSTRAINT [PK_Juridica] PRIMARY KEY CLUSTERED

(

         [ID_pessoa] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Fisica](

         [ID_pessoa] [int] IDENTITY(1,1) NOT NULL,

         [cpf] [varchar](14) NOT NULL,

         [dt_nascimento] [datetime] NOT NULL,

 CONSTRAINT [PK_Fisica] PRIMARY KEY CLUSTERED

(

         [ID_pessoa] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Pedido](

         [ID_pedido] [int] IDENTITY(1,1) NOT NULL,

         [dt_pedido] [datetime] NOT NULL,

         [ID_cliente] [int] NOT NULL,

 CONSTRAINT [PK_Pedido] PRIMARY KEY CLUSTERED

(

         [ID_pedido] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Item](

         [ID_item] [int] IDENTITY(1,1) NOT NULL,

         [ID_produto] [int] NOT NULL,

         [ID_pedido] [int] NOT NULL,

         [qtd] [int] NOT NULL,

 CONSTRAINT [PK_Item] PRIMARY KEY CLUSTERED

(

         [ID_item] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Produto]  WITH CHECK ADD  CONSTRAINT [FK_Produto_Categoria] FOREIGN KEY([ID_categoria])

REFERENCES [dbo].[Categoria] ([ID_categoria])

GO

ALTER TABLE [dbo].[Produto]  WITH CHECK ADD  CONSTRAINT [FK_Produto_Juridica] FOREIGN KEY([ID_fornecedor])

REFERENCES ...

Quer ler esse conteúdo completo? Tenha acesso completo