C# - Usando o NHibernate 2.1 com SharpDevelop 3.1 e MySQL/SQL Server


Neste artigo eu estou voltando a falar sobre o NHibernate (gostei do danado), desta vez usando a linguagem C# e o SharpDevelop 3.0, se bem que o projeto também pode ser carregado no Visual C# 2008 Express Edition.

Eu já escrevi os seguintes artigos a respeito:

Neste artigo eu vou usar o NHibernate na sua forma tradicional , gerando os arquivos de configuração e mapeamento via código e sem ajudas de ferramentas. Estou fazendo isso para você entender como o NHibernate funciona, depois você pode usar a ferramenta que desejar para ter mais produtividade mas vai estar entendendo o que esta por trás dos panos.

Eu vou usar a última versão disponível do NHibernate, a versão 2.1.2 que pode ser obtida neste link: http://sourceforge.net/projects/nhibernate/

O SharpDevelop 3.1 pode ser obtido aqui: http://www.icsharpcode.net/OpenSource/SD/Download/#SharpDevelop3x

Obs: Se quiser usar o Visual C# 2008 pegue o danado aqui: http://www.microsoft.com/express/vcsharp/

Eu vou criar um exemplo que vai usar dois banco de dados relacionais o SQL Server e o MySQL e portanto você deverá ter instalado os seguintes recursos:

Apesar da quantidade de download você não deve reclamar pois é tudo grátis.

A instalação dos pacotes acima é bem simples e de forma padrão os arquivos são instalados na pasta c:\Arquivos de Programas\

Agora eu vou explicar o que eu pretendo mostrar neste artigo:

A primeira tarefa é criar um banco de dados chamado alomundo e uma tabela chamada empregado no SQL Server e no MySQL. Como o objetivo do artigo não é mostrar como criar o banco de dados eu vou dar as definições de cada tabela para que você mesmo crie as tabelas. Seguem as instruções:

  MySQL SQL Sever
Banco de dados alomundo AloMundo
Tabela empregado empregado
tipo InnoDB ----------
Estrutura da tabela empregado:

- id - chave primária -
- nome - string(VARCHAR(50))
- gerente - inteiro (integer/int)

A tabela empregado expressa que cada empregado possui um id para identificação , um nome e um gerente;
Onde gerente é um campo inteiro que representa o código de identificação de um gerente.

Abaixo eu mostro a estrutura das tabelas criadas no MySQL e no SQL Server Express:

Tabela empregado criada no MySQL Admnistrator
Tabela empregado criada no SQL Server Express

A estrutura da tabela foi definida com uma estrutura bem simples para facilitar a elaboração do exemplo focado no recurso NHibernate.

Estando com todos os recursos instalados e funcionando e com o banco de dados e tabela criados no SQL Server 2008 Express e no MySQL você pode continuar. Havendo qualquer erro verifique e corrija pois caso contrário o exemplo não vai funcionar e você vai ficar perdido.

Criando o projeto no SharpDevelop

Abra o SharpDevelop e crie um novo projeto através do menu Arquivo->Novo->Solução;

Na janela Novo Projeto selecione :

E clique no botão Criar.

Com isso você terá a solução NHibernate_AloMundo criada.

A primeira coisa a fazer e criar uma classe POCO (plain old CLR objects) que vai representar o domínio do nosso negócio, ou seja, a tabela empregado pois o nosso interesse esta em gerenciar empregados, consultando, incluindo, alterando e excluindo-os da nossa base de informação.

Para representar o nosso domínio vamos criar uma classe chamada Empregado em um arquivo Empregado.cs.

Para criar o arquivo selecione o menu Projeto->Adicionar->Novo Item e na janela Novo Arquivo defina:

Ao final clique no botão Criar.

Agora defina a classe Empregado conforme o código abaixo:

using System;
namespace NHibernate_AloMundo
{
	/// <summary>
	/// Description of Empregado.
	/// </summary>
	public class Empregado
	{
		public int id;
		public string nome;
		public Empregado gerente;
		
		public string empregadoID()
		{
			return string.Format(id + " - " + nome);
		}
	}
}

Esta nossa classe possui 3 campos : id, nome e gerente definidas como públicas (public) ( eu sei , eu deveria usar propriedades privadas(private) , mas eu deixei as boas práticas um pouco de lado para tonar nosso exemplo mais fácil (MENOS CÓDIGO), ok. Então deixe como está e lembre-se de NUNCA fazer a mesma coisa na definições das suas classes.)

O id é o campo identificador e permite a nossa aplicação acessar o campo chave primária identidade no banco de dados de um objeto persistente. Se duas instâncias da classe Empregado tiverem o mesmo valor para o identificador elas representam a mesma linha no banco de dados.

A classe também possui um método público chamado empregadoID que retorna o id e o nome do empregado.

Dessa forma instâncias da classe Empregado poderão ser gerenciadas e persistidas pelo NHibernate note que a classe não possui nada de especial e pode ser usada como uma classe comum.

Neste momento temos a nossa tabela empregado e a nossa classe empregado. Os dois recursos estão separados por um rio chamado impedância objeto/relacional e precisamos definir um recurso para o NHibernate saber como eles estão relacionados.

Precisamos portando vincular dois mundos : o mundo dos SGBDs relacionais (a nossa tabela) e o mundo dos Objetos (a nossa classe).

Quem faz esse papel são os arquivos de mapeamento e quase sempre devemos ter um arquivo para cada classe do nosso domínio. Estes arquivos possuem a nomenclatura: nome_da_classe.hbm.xml

No nosso exemplo teremos então um único arquivo de mapeamento chamado : Empregado.hbm.xml

Agora vamos criar o arquivo XML de mapeamento para o NHibernate saber como gerenciar e persistir os objetos relacionados com a tabela do banco de dados.

Para criar o arquivo selecione o menu Projeto->Adicionar->Novo Item e na janela Novo Arquivo defina:

Para encerrar clique no botão Criar.

A seguir defina o seguinte conteúdo no arquivo XML:

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
<class name="NHibernate_AloMundo.Empregado, NHibernate_AloMundo" lazy="false">
  <id name="id" access="field">
     <generator class="native" />
   </id>
   <property name="nome" access="field" column="nome"/>
   <many-to-one access="field" name="gerente" column="gerente" cascade="all"/>
</class>
</hibernate-mapping>

Veja abaixo o mesmo arquivo no editor SharpDevelop e note que existe uma definição importante que você deve fazer.

Na janela Propriedades do arquivo, em Construir Ação você deve definir o valor : EmbeddedResource;

Obs: Se você estiver usando uma versão anterior do NHibernate a sintaxe pode ser diferente, principalmente na definição do arquivo de mapeamento.

O arquivo de mapeamento criado informa ao NHibernate o seguinte:

O arquivo de mapeamento é fácil de manter e entender e existem ferramentas que geram estes arquivos conforme você poderá verificar em meus artigos nas referências.

Acompanhe a segunda parte em : C# - Usando o NHibernate 2.1 com SharpDevelop 3.1 e MySQL/SQL Server

Referências:


José Carlos Macoratti