orm: sendo produtivo com nhibernate
DESCRIPTION
Frameworks de mapeamento de objeto-relacional (ORM) são hoje ferramentas indispensáveis nos projetos de desenvolvimento de sistemas. E em se tratando de frameworks de ORM, um dos mais conhecidos e utilizados pela comunidade é o NHibernate. Nessa apresentação você verá os principais pontos que fazem dos frameworks de ORM e do NHibernate ferramentas tão importantes nos projetos, desmistificar seus maiores mitos, os principais recursos, ferramentas de análise (NHProof) e verá também como ser produtivo com o NHibernate.TRANSCRIPT
NHibernateSendo preguiçoso com NHibernate
Juliano Oliveira
Preguiçalembra...
Preguiçalembra...
Preguiçalembra...
NHibernateSendo preguiçoso com NHibernate
Juliano Oliveira
NHibernateSendo preguiçoso com NHibernate
Juliano Oliveira
NHibernateSendo PRODUTIVO com NHibernate
Juliano Oliveira
Ser PRODUTIVO!
Agenda
Tópico 1
Tópico 2
Tópico 3
Tópico 4
Agenda
Mapeando seu modelo
Sendo produtivo com NHibernate
Exemplos práticos: A Hora do Show
Dúvidas
A vida sem ORM
Muito trabalho
Modelar Tabelas
Classes DAL
Objetos DTO
Camada BLL
Camada DAL
public UsuarioDAL{ public ArrayList<Usuario> retornaUsuarios(){ ..... }}Camada BLL
public UsuarioBLL { public ArrayList<Usuario> retornaUsuarios() { UsuarioDAL usuarioDAL = DALFactory.UsuarioDAL.Create(); return usuarioDAL.retornaUsuarios();
} }
Camada DTO
public class Usuario { private String _id; private String _nome;
public String Id() { get { return _id; } }
public String Nome() { get { return nome; } }
public Usuario(String usuarioID, String usuarioNome) {
this.usuarioID = usuarioID; this.usuarioNome = usuarioNome; } }
A vida sem ORM
A vida sem ORM
ORM
ORM é MAPEAMENTO DE OBJETO-RELACIONAL
A proposta do ORM◦Resolver a impedância entre OO e ER◦Facilitar o acesso a dados◦Tornar o trabalho mais ORIENTADO A OBJETOS
Banco Relacional
ORMEntidades
OO
O NHibernate mais de perto
Framework de ORMPortado do Hibernate escrito em Java para
.NetOpen-sourceLicença LGPL - uso comercialSistema de queries OO
◦HQL◦Criteria API
Gerenciamento de Sessões e Transações
O NHibernate mais de perto
Suporta conceitos de OO◦Associação, herança, polimorfismo, coleções,
etc...Suporta a maior parte dos banco de dados
relacionais do mercado◦SQL Server, Oracle, MySQL, PostgreSQL, SQLite,
etc ...Perfeito para uma arquitetura como o
DDD
O NHibernate mais de perto
ArquiteturaAplicação
Banco de dadosEntidades relacionais
NHibernate
Objetos de Persistência
configuração mapeamento
Configuração de conexão e banco de dados
Mapeamento dos objetos e entidades relacionais
Modele entidades, não tabelasModelando classes
◦Abstrações◦Entidades◦Objetos de Valor◦Coleções
Modele entidades, não tabelas
Mapeando seu modelo
ClasseCliente.cs
Cliente.hbm.xml Banco de dadosTabela Clientes
Mapeando seu modelo
Classe Cliente.cs
public class Cliente{ public virtual int Id { get; set; } public virtual string Nome { get; set; } public virtual string Endereco { get; set; }}
Mapeando seu modelo
Mapeamento Cliente.hbm.xml
<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="Cliente" table="Clientes"> <id name="Id" column="idCliente"> <generator class="hilo" /> </id> <property name="Nome" type="String" length="75" /> <property name="Endereco" type="String" length="150" /> </class></hibernate-mapping>
Mapeando seu modelo
Tabela Clientes
Mapeando seu modelo
Tags de mapeamento mais usadas◦class◦id◦property◦many-to-one◦one-to-one◦Tags para coleções
Mapeando seu modelo
Tags de mapeamento para coleções◦set
coleção de itens únicos◦bag
coleção de itens que podem se repetir◦list
uma “bag” indexada por um número inteiro◦map
uma “bag” indexada por um valor qualquer
Ser PRODUTIVO!
Sendo produtivo com NHibernateFerramenta de exportação e atualização
das tabelas do banco de dados
Com seu modelo pronto, crie suas tabelas no banco de dados com o seguinte comando:
Configuration cfg = new Configuration().Configure();SchemaExport generator = new SchemaExport( cfg );generator.Create(true, true);
Sendo produtivo com NHibernateFerramenta de exportação e atualização
das tabelas do banco de dados
Mudança no modelo? Fácil! Atualize o banco de dados com o seguinte comando:
Configuration cfg = new Configuration().Configure();SchemaUpdate update = new SchemaUpdate( cfg );update.Execute(true, true);
Sendo produtivo com NHibernateNunca mais escreva SQL´s
Cliente cliente = _sessao.Get<Cliente>(222);
Selecionar o “Cliente” de código “222”:
Sendo produtivo com NHibernateNunca mais escreva SQL´s
IList<Cliente> cliente;cliente = _sessao.CreateCriteria<Cliente>().List<Cliente>();
Selecionar todos as entidades “Cliente”:
Sendo produtivo com NHibernateNunca mais escreva SQL´s
string strQuery = “from Cliente c where count(c.Pedidos) > 10”;IList<Cliente> cliente = _sessao .CreateQuery(strQuery).List<Cliente>();
Selecionar todos as entidades “Cliente” que tenham comprado mais de 10 vezes:
Sendo produtivo com NHibernateTrabalhe com Objetos
Cliente cliente = new Cliente();cliente.Nome = “Juliano Oliveira”;cliente.Endereço = “São Paulo”;
_sessao.Save(cliente);
Sendo produtivo com NHibernateTrabalhe com Objetos
Cliente cliente = _sessao.Get<Cliente>(222);
cliente.Nome = “Juliano P. Oliveira”;cliente.Endereço = “Barra Funda”;
_sessao.Update(cliente);
Sendo produtivo com NHibernateTrabalhe com Objetosusing(var tx = _sessao.BeginTransaction()) {
Cliente cliente = _sessao.Get<Cliente>(2222); ItemDoPedido itemDoPedido = ItemDoPedidoFactory .Quantidade(2) .Produto(864) .Criar();
Pedido pedido = new Pedido(cliente); pedido.AdicionaItemAoPedido(itemDoPedido);
_sessao.Update(pedido); tx.Commit();}
Sendo produtivo com NHibernateGerencie sua conexão automaticamente
protected void Application_BeginRequest(){ ManagedWebSessionContext.Bind( HttpContext.Current, SessionManager.SessionFactory.OpenSession());}
Sendo produtivo com NHibernateGerencie sua conexão automaticamente
protected void Application_EndRequest() { ISession session = ManagedWebSessionContext.Unbind( HttpContext.Current, SessionManager.SessionFactory);
if (session != null) { if (session.Transaction != null && session.Transaction.IsActive) session.Transaction.Rollback(); else { session.Flush(); session.Close(); } }}
Exemplos práticos: A Hora do Show
Ferramenta NHProf
Referências
Site Oficial do NHibernatehttp://www.nhforge.org/
Blog Ayende Rahienhttp://ayende.com/blog
NHProf – The NHibernate Profilerhttp://www.nhprof.com
Projeto de Tradução da Documentação do NHibernatehttp://nhibernate.programandoem.net
Obrigado!Não esqueçam de entrar no grupo .Net Architects
no Google Gruposhttp://groups.google.com/group/dotnetarchitects