Israel Aéce

Microsoft MVP, MCP, MCAD, MCTS, MCPD e MCT

My Links

Blog Stats

Archives

Post Categories

Links

Login

O/R Mapping - NHibernate

Bem, já com quase dois anos programando sempre em .NET, há algum tempo descobri que não adianta nada sabermos uma plataforma se não sabemos quais as melhores formas de desenvolver e planejar, adotando assim as melhores práticas e designs para que em uma futura manutenção ou mesmo em questões de reusabilidade de código seja facilmente realizada.

Com isso em mente, me dedico atualmente em aprender as Design Patterns de GoF, os Designs de Martin Fowler e agora, abrindo a mente e analisando ferramentas/componentes que auxiliam nas questões que citei um pouco acima. E conversando com meu Amigo João Paulo Carreiro há algum tempo, ele me apresentou o NHibernate, que até o momento é o maior framework para desenvolvedores .NET disponível, podendo ser encontrado no SourceForge, na seguinte URL: http://nhibernate.sourceforge.net. A Microsoft também está desenvolvendo uma ferramenta de O/R Mapping chamado ObjectsSpaces, que imaginava que ela seria distribuída juntamente com o Visual Studio .NET 2005, mas infelizmente virá mais tarde, talvez juntamente com o LongHorn.

Para quem não sabe, NHibernate ou mesmo as ferramentas de O/R Mapping (Object/Relational Mapping), são frameworks (no caso do NHibernate) que mapeiam as tabelas da Base de Dados para os nossos Objetos de nossa aplicação, através de arquivos, que pelo que pude perceber, são arquivos XML.

Claro que inicialmente optei por fazer o exemplo da classe User que está sendo explicada no QuickStart. E logo fui criando uma Aplicação ASP.NET, para poder usufruir do NHibernate. Depois da referència ao NHibernate, criei uma classe User com as suas devidas propriedades:

using System;
namespace SamplesCS{
     public class User{

          private string
userName;

          public string UserName{
               get {return userName;}
               set {userName = value;}
          }
     }
}

OBS.: Optei por diminuir a quantidade de propriedades para não ocupar muito espaço.

Depois da classe User criada, agora é hora de se fazer o arquivo XML que será responsável pelo Mappging da tabela “users” do Banco de Dados para esta Classe User. Por obrigatoriedade, os arquivos, devem ser: NomeClasse + “hbm.xml”. Sendo o seu conteúdo algo semelhante:


Como podemos ver, no arquivo acima, fazemos o relaciomento entre: Objeto com Tabela da Base de Dados e Campos da Tabela com as Propriedades deste Objeto. Depois de feito isso, em nossa aplicação, fazemos:

public void Teste(){
     Configuration cfg = new Configuration();
     cfg.AddXmlFile(Server.MapPath("User.hbm.xml"));

     ISessionFactory factory = cfg.BuildSessionFactory();
     ISession session = factory.OpenSession();
     ITransaction transaction = session.BeginTransaction();

     User newUser = new User();
     newUser.Id = "1";
     newUser.UserName = "IsraelAece";
  
     session.Save(newUser);
     transaction.Commit();
     session.Close();
}

Talvez estranhem, pois estou utilizando o método AddXmlFile(...) para informar qual o arquivo XML que será usado para tomar por base para o mapeamento. Utilizei este método, pois não consegui fazer através do método AddAssembly(...), como explica o QuickStart, dizendo que não era possível encontrar o arquivo de Mapping. Bem, já fica aqui uma dúvida :P

Mas de qualquer forma, este código acima faz com que um novo usuário (User) seja inserido na tabela “users”, e o mais interessante disso: sem nenhuma linha de Querys SQL. De certeza forma, parece até mágica, mas isso está tudo encapsulado no Framework, pois ele se encarrega de criar as Querys e seus respectivos paràmetros.

Pois bem, ainda nem sequer explorei tudo o que o NHibernate fornece, mas tem outras “features” bem interessantes, como Caching e Lazy Loading, características quais, em breve pretendo aqui colocar.

posted on Thursday, August 26, 2004 10:01 PM

Feedback

# re: O/R Mapping - NHibernate 8/27/2004 5:36 AM Pedro Santos

Mas esse exemplo é super simples. E se tivermos classes com contentores como hashtable's ou ArrayLists, em que alguns até podem conter singletons?

# re: O/R Mapping - NHibernate 8/27/2004 7:51 AM rbfigueira

A questão do Pedro é importante !

Bem, eu nunca experimentei o NHibernate mas com tantas soluções fica difícil escolher a melhor....

Ainda não li muito sobre o NHibernate mas penso que é algo que é feito para não ser necessário escrever SQL para obter/inserir dados na database.
Então para que server uma DAL ?

Qual a "mais valia" do NHibernate em relação ao Microsoft.ApplicationBlocks.Data (DAL Helper)!!

É claro que não temos que escrever SP ou SQL mas tambem com o NHibernate terás de criar os ficheiros XML !!!
Em termos de performance + rapidez compensa ????

Bem, quem o utiliza poderá explicar melhor o porque e a "mais valia" do NHibernate !!

Um abraço

# re: O/R Mapping - NHibernate 8/27/2004 8:59 AM Israel Aece

Como disse no post: "Claro que inicialmente optei por fazer o exemplo da classe User que está sendo explicada no QuickStart." :P

Claro que pretendo me aprofundar ainda mais, mas vamos com calma ne. Nao sou nenhum Guru!

Mas Ricardo, quando utilizamos uma DAL, mesmo assim temos que fazer os "mappings", so que manualmente para os nossos Objetos e nisso, com o XML ja esta tudo definido.

Acho que existem ferramentas de O/R, que le as tabelas da DB e cria os arquivos XML e talvez ate as classes. O problema do NHibernate e que ate onde conheco, nao existe uma UI para ele, tendo que fazer os arquivos de mappings (XML) na mao.

Vamos esperar por mais comentarios ;)

# re: O/R Mapping - NHibernate 8/27/2004 9:51 AM Gilberto Neto

Eh, eu sinceramente gosto de fazer procedures, pois - irei falar apenas do sql server - eh um ótimo ganho de performance. Isso parece aquele esquema que o pessoal usava antigamente no velho asp, o addnew do ado, eheheh... parece uma coisa bem legal e complexa, mas será que a performance eh boa? melhor que usar procedures? não gosto da geração dinâmica de instruções sql q ele faz, vc perde meio que o controle de como vai chegar no banco isso. Eh isso ai! Mas vou dar uma lida, Israel, vc acha que essa eh a melhor forma? :)

# re: O/R Mapping - NHibernate 8/27/2004 11:03 AM Israel Aece

As querys sao parametrizadas, sendo assim, a performance em relacao as Stored Procedures e a mesma, pois ela nao e recompilada a cada vez que e utilizada (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_core_dao_queries.3a_.filtering_and_parameterizing_queries.asp).

Talvez esteja esquecendo da principal utilidade do NHibernate, onde a finalidade e mapear os campos da DB para os objetos da nossa aplicacao, talvez possa perder um pouco de performance, mas a utilidade e praticidade e muito grande.

Pode nao utilizar, mas ainda gastara tempo para mapear cada campo da DB ou melhor, da sua fonte de dados para cada DataMember do teu objeto.

# re: O/R Mapping - NHibernate 8/27/2004 11:11 AM Denis Falqueto

Oi pessoal!

É engraçado que isso ainda não seja de conhecimento prá quem usa produtos de desenvlolvimento da M$ (parece que esse é o caso aqui ;-) ). O NHibernate foi portado do Java (o nome original é Hibernate) e funciona maravilhosamente lá há algum tempo já. Esse tipo de ferramenta é uma coisa que eu acho que já devia existir há pelo menos uns 10 anos (mas fazer o que, né?). Ela preenche uma lacuna entre o que a gente programa e o que a gente usa prá guardar nossos dados. Nós fomos treinados a usar a orientação a objetos noas nossas aplicações mas temos que fazer um malabarismo horrível prá guardar isso em estruturas de tabelas. Essa diferença tinha que ser tratada pelo nosso próprio código. Então uma classe de regra de negócios tem que ter as regras propriamente ditas e aquele monte de lixo (código sql). Se, por acaso, você precisar mudar o banco de dados, você está em sérios apuros. Todo o seu SQL vai ter que ser mudado. Eu acho que isso é muito sério, afinal de contas, nossos clientes tem a liberdade (e o direito) de escolherem em que armazenar os dados que são deles.

Eu não conheço a fundo o NHibernate, mas tenho estudado bastante o Hibernate do Java. Ele é uma plataforma completa para relacionamentos entre objetos e bancos de dados. Ele permite herança, associações entre objetos (1 para 1, 1 para n ou n para n, embora um relacionamento n para n possa sempre ser expressado sobre a forma de dois 1 para n e esse é o método preferido). O poto mais importante, na minha opinião, é a existência de uma linguagem de consulta INDEPENDENTE de banco de dados. Os resultados das consultas podem ser objetos propriamente ditos ou valores escalares (somatórios, contagens, médias, etc). Se o resultado for um objeto, você pode chamar um método da classe desse objeto diretamente sobre as instâncias retornadas pelo resultado da consulta. Isso é fasciinante! A única coisa que me desanima um pouco não é o Hibernate propriamente dito, mas o gerenciamento de interfaces de usuário do Java que é bem complicado. Sinceramente, a facilidade de construir interfaces gráficas do Visual Studio integrada com a facilidade de acesso aos dados do NHibernate é uma combinação sem precedentes. Ah, outra coisa: também dá prá acessar a camada do banco de dados prá enviar queries diretamente, se for necessário. Mas depois de você conhecer a linguagem de consulta, duvido muito que você queira ver SQL de novo pela frente.

Falei demais, mas é isso aí! Bons estudos para todos nós! A propósito, o livro de padrões de projetos do Gamma é fundamental prá entender bem o que se passa por dentro desse tipo de ferramenta. Eu li ele esse ano e fiquei fascinado. Sinceramente, mudou minha forma de pensar totalmente.

Um abraço!

# re: O/R Mapping - NHibernate 8/27/2004 12:24 PM rbfigueira

Denis, obrigado pela tua explicação !!

>>>uma linguagem de consulta INDEPENDENTE de banco de dados.

Ou seja usando o NHibernate pode ler, sem alterar nenhum código, SQLSERVER, MYSQL, ORACLE, etc ???
Se sim é a mesma coisa que ter o DAL (Microsoft.ApplicationBlocks.Data v3) mas menos potente....

>>Sinceramente, a facilidade de construir interfaces gráficas do Visual Studio integrada com a facilidade de acesso aos dados do NHibernate é uma combinação sem precedentes.

Bem, se não perdemos performance... é uma "bomba".
Mas porque a MSFT em vez de estar a criar Microsoft.ApplicationBlocks.Data porque não investiu tempo em um NHibernate???
Não tem mesmo desvantagens !??!?

Dá muito que pensar!!!
Vamos ver se alguem aqui utiliza o NHibernate para dar o seu feedback :P

Um abraço

# re: O/R Mapping - NHibernate 8/27/2004 12:31 PM Israel Aece

Mas a Microsoft esta a trabalhar para criar um O/R, este chamado ObjectsSpaces (O link esta acima), mas vira futuramente.

>> Se sim é a mesma coisa que ter o DAL (Microsoft.ApplicationBlocks.Data v3) mas menos potente....

Mas o NHibernante nao serve somente para acessar a DB, mas sim transpor os dados que la estao para os objetos da nossa aplicacao.

# re: O/R Mapping - NHibernate 8/27/2004 2:25 PM Joao Paulo Carreiro

A DAAB permite somente executar commandos ADO.NET de uma maneira mais simples, do q usando ADO.NET a pata.

Comparar com o nHibernate ( ou qq O/RM ke mereca este nome) nao tem nada a ver.
Nao se compara um Ferrari com um Fiat :p

Algo mais parecido com o DAAB, seria o IBATIS ( versao .NET em http://sourceforge.net/projects/ibatisnet ). E mesmo assim, o IBATIS tem funcionalidade de mapeamento, que faltam ao DAAB (http://martinfowler.com/eaaCatalog/dataMapper.html)

Uma framework de O/RM é muito mais que um DataMapper e uma DAL, gerindo todo a interaccao com a DB, independentemente da DB k esta por detras.

Deiam uma olhadela aqui:
http://www.ambysoft.com/mappingObjects.html




# re: O/R Mapping - NHibernate 8/28/2004 9:21 AM Gilberto Neto

Israel, sobre a performance, ainda estou analisando melhor, e só vi essa afirmação sobre ela geralmente não ser recompilada. Pelo que conheço do optimizer do sql server, isso só ocorreria se ele considerar as querys realmente iguais, ao contrário das procedures que sempre será utilizado o plano de execução existente, mesmo não sendo o melhor, a não ser que explicitamente utilize o recompile. Estou analisando, mas sinceramente uma query pra não ser recompilada (utilizar o plano de execução existente de outra) eh bem complicado.. assim que tiver mais coisas te falo.
Abs

# re: O/R Mapping - NHibernate 8/30/2004 10:21 AM Denis Falqueto

Oi gente

Acho que falei um bocado e acabei esquecendo algumas coisas :-P

Sobre performance, sem dúvida não vai poder ser comparado com consultas otimizadas para cada banco de dados. Na verdade, eu acho que nem tem que ser comparado... são coisas muito diferentes. As ferramentas de mapeamento O/R tem o objetivo de eliminar uma barreira entre o nível físico e o nível lógico. Pelo que eu tenho lido sobre o Hibernate original, a performance só é realmente degradada quando você compara operações que poderiam ser feitas com um UPDATE ou um DELETE sobre vários registros. No caso do Hibernate, ele acaba gerando um UPDATE ou DELETE para cada registro afetado. Com SQL direto, nós temos a sensibilidade de usarmos um critério bem abrangente e executamos apenas um comando. Só que esses são casos-limite. Eles não deveriam acontecer o tempo todo. Se acontecem com uma frequência maior, então podemos disparar um comando de SQL de dentro do ambiente Hibernate. Mas eu acredito que isso seja a exceção, não a regra. Além disso, existe um recurso chamado proxy, em que cada objeto é carregado com o mínimo de informações necessárias, para ser totalmente carregado apenas se for necessário. Por exemplo, uma objeto com umas 15 propriedades poderia ser carregado apenas com a chave primária e uma descrição. Se alguma propriedade extra for referenciada durante o processamento, o resto do objeto é carregado. Isso minimiza o tráfego de rede e o consumo de memória da aplicação.

Sobre a Microsoft não ter pensado nisso antes, acho que é normal. Ela não tem que pensar em tudo. Acho que um dos que mais tem falado sobre isso é o Scott Ambler, que o João Paulo Carneiro citou acima. É definitivamente uma tendência, já que o Delphi 8 para .Net já possui uma ferramenta muito similar chamada ECO. Eu vi uma apresentação dele e fiquei impressionado. Eles fizeram uma fusão de uma outra ferramenta que eles compraram que gerencia o UML com o código fonte automaticamente. Se um for alterado o outro reflete a mudança na hora. Além disso, a comunidade open source tem mais flexibilidade e menos compromissos comerciais (prá quê a Microsoft vai querer independência de banco de dados se ela vende um?). Tudo isso deve ser levado em consideração.

Desculpe por mais um post gigantesto... mas esse assunto me interessa muito. Eu estou até tentando fazer uma coisa "parecida" prá Delphi 7 prá uso pessoal (ou seja, não vai ser tão genérico, mas vai ter uma linguagem de consulta independente de banco :-)).

Valeu!

# re: O/R Mapping - NHibernate 8/30/2004 12:21 PM Joao Paulo Carreiro

>Sobre a Microsoft não ter pensado nisso antes, acho que é normal. Ela não tem que pensar em tudo.

Ela pensou. Afinal o ObjectSpaces eram para ter saido na versao 1.0 de .NET. Quando .NET foi apresentada no PDC, no DVD vinha uma alpha dos ObjectSpaces.

Agora o facto de OS serem ainda "vapourware", isto já é outra história que nao sei explicar.

Em relacao a performance, eu nao entendo a fixacao que muita gente tem por ela. Dizem que tem k usar SPs, "arrumar" o SQL, etc. Mas no fim, 95% dos casos usa-se simplesmente SQL genérico.

Desde q a ferramenta de O/RM permita optimizar os casos "edge", entao nao há que preocupar.

# re: O/R Mapping - NHibernate 8/31/2004 10:49 AM Denis Falqueto

Dêem uma olhada nessa página:

http://jcframework.sourceforge.net/

É a home page de um outro projeto de O/R para .net que eu fiquei sabendo ontem. No site está falando uma coisa engraçada:

"The project is similar to what Microsoft's ObjectSpaces aims to be, but includes more functionality and is not tied to a particular database server as their solution will be."

Pelo que se lê aí (não sei até que ponto podemos confiar...), o ObjectSpaces seria apenas para os produtos de banco de dados da Microsoft. Esse tipo de coisa tá ficando meio comum prá Microsoft. Lançar um produto generalista prá um caso específico. Outro exemplo é a própria plataforma .net. Ela tem tudo prá ser portável mas foi implementado apenas para Windows. Intrigante.

Um abraço.

# re: O/R Mapping - NHibernate 8/31/2004 11:19 AM Gustavo Brito

Oi Pessoal!!!

O que o Israel falou, é perfeito pra nós desenvolvedores.... vamos esperar mais um momento até tudo ficar bem claro pra nós!!!!


Um abraço

# re: O/R Mapping - NHibernate 8/31/2004 11:39 AM Joao Paulo Carreiro

Denis,

>Pelo que se lê aí (não sei até que ponto podemos confiar...), o ObjectSpaces seria apenas para os produtos de banco de dados da Microsoft. Esse tipo de coisa tá ficando meio comum prá Microsoft. Lançar um produto generalista prá um caso específico

Onde é que está escrito q a MS tem que suportar outras tecnologias?

Eu pessoalmente prefiriria que o OS ( se alguma vez sair) fosse agnostico em relacao a DBs.

Mas compreendo perfeitamente q a MS nao vai estar a querer atirar dinheiro fora criando productos que possam ser usados com DBs concurrentes. Criar um OR/M nao é brincadeira. Tens que no minimo criar um engine de traducao do OQL ( ou qq ke seja a linguagem de queries do OR/M) para cada DB.

Se deres uma olhadela no codigo do nHibernate, vais ver ke nao é assim tao simples.

Em relacao a OR/M, o principal objectivo é criar uma framework que torne o codigo OO independente das idiocronsias do modelo Relacional, e nao independente da DB.
A maior parte dos OR/Ms decide ( e eu acho muito bem) incluir independencia do SGBD.

# re: O/R Mapping - NHibernate 9/29/2004 10:09 AM Israel Aece

Lendo o Blog de Paul Wilson (http://weblogs.asp.net/pwilson), ele fez dois posts que achei interessantes que envolve OR/M. Vejam:

http://weblogs.asp.net/pwilson/archive/2004/09/18/231188.aspx

http://weblogs.asp.net/pwilson/archive/2004/09/05/225827.aspx

# O/R Mapping - NHibernate - Resource Files 10/14/2004 1:31 AM Israel A

# re: O/R Mapping - NHibernate 12/21/2004 5:07 PM Paula Antunes

Olá. Alguem aqui usa banco de dados orientado a objeto (oracle ou DB2) com as caracteristicas OO?
Gostaria de saber se realmente é mais facil o mapeamento ....

valeus guys

# re: O/R Mapping - NHibernate 2/10/2005 7:58 AM Rubens Arandas

Existe uma ótima ferramente sobre o assunto chamada <a href="http://www.llblgen.com/">llblgen</a>. Não a conheço o sulficiente para indicar, no entanto já estamos em processo de adoção aqui na empresa e pelo que pude ver, é ótima!!!!

# re: O/R Mapping - NHibernate 2/20/2005 2:49 PM Luiz Carlos Faria

Ainda há muito que se aprender sobre o NHibernate. Com certeza, sabemos que a utilização de um framework deste tipo irá aumentar consideravelmente o volume de processamento até a execução dos SQL’s. A incógnita que fica qual o impacto no desempenho das aplicações.

Onde trabalho, temos DBA`s de desenvolvimento, e é comum a execução de tunning de queries por eles. Este problema acontece porque nosso cliente tem condições críticas de acesso, tendo como ponte para a rede, conexão a radio. Há casos onde performance não é crucial, mas estas são exceções.
Com este cenário, considero muito importante quantificar as percas e colocar na balança de acordo com os benefícios da utilização de um framework O/RM.

Atenciosamente

# re: O/R Mapping - NHibernate 2/28/2005 6:25 PM marcos

Pessoal,
Não sei se é aqui que devo perguntar, se não for desculpe-me.
Estou usando Nhibernate e gotaria de mapear para a coluna da tabela uma propriedade de um tipo forte. Vou dar um exemplo.

Public Class CColuna
Private _valor As String
Private _valorOld As String
Public Property Valor() As String
Get
Return _valor
End Get
Set(ByVal Value As String)
_valor = Value
End Set
End Property

Public Property ValorOld() As String
Get
Return _valorOld
End Get
Set(ByVal Value As String)
_valorOld = Value
End Set
End Property


<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

<class name="ClasseA, VB" table="tbTeste">

<id name="fldValor" column="Valor" type="CColuna" length="20">

<generator class="assigned" />

</id>

<property name="fldValorOld" column="valorOld" type="CColuna" length="20" />

</class>

</hibernate-mapping>
</class>

Valeu
Abraço a todos

# re: O/R Mapping - NHibernate 2/28/2005 10:36 PM Israel Aéce

Ola Marcos,

Nao entendi o que precisa. Se tiver alguma duvida, pode entrar em contato diretamente comigo atraves da secao Contact deste Blog.

# re: O/R Mapping - NHibernate 5/9/2005 1:24 AM Luis Carlos

Olás...
Com relação a performance, me parece q não é tão rápido qto o plano do SQL Server... mas será q devemos deixar de usar por isso? Acho que se for uma aplicação onde a performance é crítica devemos pensar melhor, caso contrário acredito q vale a pena...

Segue aí mais uma opnião:
I can't comment on exact numbers, but NHibernate will always be slower than plain SQL, just like .NET is slower than assembly, that is the price for the added flexibility.

Fonte: http://sourceforge.net/forum/message.php?msg_id=3060550


[]s
LCG

Title  
Name  
Url
Box Code
Protected by FormShield
Comments