SlideShare uma empresa Scribd logo
ORM
@henriquericcio
Persistência
"Na ciência da computação, persistência refere
a característica de estado que sobrevive além
do processo no qual é criado. Sem esta
capacidade, o estado existirá apenas na
memória RAM, e pode se perder quando
ocorrer a interrupção da alimentação de
energia, como quando o computador é
desligado." - Wikipedia
Mundo OO
Persistência é uma necessidade primária de
aplicações. Em algum momento é necessário
armazenar dados, inclusive em aplicações OO.
Gerenciadores de Banco de Dados OO:
● Caché
● db4o
● ObjectDB
Realidade
● Persistência apoiada em gerenciadores não
OO, normalmente relacionais;
● Produtos e marcas fortes no mercado,
como: Microsoft SQL Server, Oracle,
MySQL;
● Legado: regras de negócio escritas para o
SGBD;
● Padronização da SQL;
● Investimentos altíssimos em SQL;
Solução
"Object-relational mapping (ORM, O/RM,
and O/R mapping) in computer software is a
programming technique for converting data
between incompatible type systems in object-
oriented programming languages. This
creates, in effect, a "virtual object database"
that can be used from within the programming
language. There are both free and
commercial packages available that perform
object-relational mapping, although some
programmers opt to create their own ORM
tools." - Wikipedia
Vantagens
● Um monte de tarefas relativas a banco de dados é feita
automaticamente.
● Nem todo mundo escreve bons codigos SQL, o ORM
escreve SQL padronizado.
● Iniciar transações, usar comandos preparados, etc é
simples como chamar um método.
● Se encaixa naturalmente ao estilo de código corrente.
● Abstrai o banco de dados.
● O model fica fracamente acoplado ao código de infra
para banco.
● Permite uso de vantagens OOP como herança no
model sem dor de cabeça.
Desvantagem
● Curva de aprendizado;
● Performance; (vs. master SQL dev)
Mapeamentos
São conhecidas as seguintes estratégias de
mapeamento:
● Propriedades
● Um para um;
● Um para muitos;
● Muitos para muitos;
● Componentes
● Herança;
Um para um
Um para muitos
Muitos para muitos
Herança
Estratégia 1
Single table per class hierarchy strategy
Uma única tabela mantém todas as instâncias da
hierarquia.
Estratégia 2
Joined subclass strategy
Uma tabela por classe e subclasse.
Cada tabela mantém as propriedades de uma subclasse
específica.
Estratégia 3
Table per class strategy
Uma tabela por classe concreta.
Outros aspectos
● Cascade
● Associação Unidirecional/Bidirecional
● Query Language
● Mapping
● Unit of work
● Lazy Load
● Query Object
Abordagens
● Model First
● Code First
● Data Base First
NHibernate
O NHibernate é um ORM Open-Source, que
surgiu através do Hibernate, voltado
exclusivamente para desenvolvedores Java,
sendo a princípio era um port do Hibernate,
mas passou a ser um projeto independente.
Sendo assim, apresenta uma certa maturidade,
principalmente por ser um framework com uma
equipe colaborando ativamente.
Mapping
● XML
● Atributos
● FluentNHibernate
● Code Mapping
XML
<hibernate-mapping>
<class entity-name="Customer">
<id name="id" type="long" column="ID">
<generator class="sequence"/>
</id>
<property name="name" column="NAME" type="string"/>
<property name="address" column="ADDRESS" type="string"/>
<many-to-one name="organization" column="ORGANIZATION_ID" class="Organization"/>
<bag name="orders" inverse="true" lazy="false" cascade="all">
<key column="CUSTOMER_ID"/>
<one-to-many class="Order"/>
</bag>
</class>
</hibernate-mapping>
Atributos
[Class(Schema = "dbo", Table = "`ProgramRequirements`")]
[Cache(1, Usage = CacheUsage.ReadWrite)]
public class ProgramRequirements : NhBase<ProgramRequirements>
{
[Id(Name = "Id", Column = "ID"), Generator(1, Class = "native")]
public virtual int Id { get; set; }
[ManyToOne(Column = "DeptID", OuterJoin = OuterJoinStrategy.False)]
public virtual Department Department { get; set; }
[ManyToOne(Column = "ProgID", OuterJoin = OuterJoinStrategy.False)]
public virtual Program Program { get; set; }
[Property(Column = "ProgReqTypeID")]
public virtual ProgramRequirementsType RequirementsType { get; set; }
[Property]
public virtual string Name { get; set; }
[Property]
public virtual string Description { get; set; }
}
Fluent NHibernate
public class PedidoMap : ClassMap<Pedido>
{
public PedidoMap()
{
Table("Orders");
Id(x => x.Id).Column("OrderID").Not.Nullable().GeneratedBy.Identity();
Map(x => x.DataPedido).Column("OrderDate");
Map(x => x.DataSolicitacao).Column("RequiredDate");
Map(x => x.DataEntrega).Column("ShippedDate");
Map(x => x.Frete).Column("Freight");
Map(x => x.NomeEntrega).Column("ShipName");
Map(x => x.EnderecoEntrega).Column("ShipAddress");
Map(x => x.CidadeEntrega).Column("ShipCity");
Map(x => x.RegiaoEntrega).Column("ShipRegion");
Map(x => x.CodigoPostalEntrega).Column("ShipPostalCode");
Map(x => x.PaisEntrega).Column("ShipCountry");
HasMany(x => x.Itens).KeyColumns.Add("OrderID", mapping => mapping.Name("OrderID").Not.Nullable());
References(x => x.Cliente).Columns("CustomerID").Cascade.None();
References(x => x.Empregado).Columns("EmployeeID").Cascade.None();
References(x => x.Entregador).Columns("ShipVia").Cascade.None();
}
}
Code Mapping
public class DogMap : ClassMapping<Dog>
{
public DogMap()
{
Table("Dog");
Id(x => x.Id, m => m.Generator(Generators.Identity));
Property(x => x.Name);
Property(x => x.Age);
}
}
Queries
● SQL Nativo
● HQL
● Criteria
● QueryOver
● Linq
SQL Nativo
IList cats = session.CreateSQLQuery(
"SELECT {cat.*} FROM CAT {cat} WHERE
ROWNUM<10",
"cat",
typeof(Cat)
).List();
HQL
IList cats = sess.Find( "from Cat as cat where
cat.Mate.Birthdate is null" );
Criteria
ICriteria crit = session.CreateCriteria(typeof(Cat));
crit.Add( Expression.Eq("color", Eg.Color.Black) );
crit.SetMaxResults(10);
IList cats = crit.List();
Query Over
IList<Cat> cats =
session.QueryOver<Cat>()
.Where(c => c.Name == "Max")
.List();
Linq
var user = from u in session.Query<User>()
where u.Username == username
select u;
var user = session.Query<User>().Where(u =>
u.Username == username);
NEXT!!!
Entity Framework
Recursos
Argumentos OODB vs RDB
http://stackoverflow.com/questions/800/object-oriented-vs-relational-databases
http://www.leavcom.com/db_08_00.htm
Sobre model/code/database first
http://social.msdn.microsoft.com/Forums/en-US/eb695b8b-0638-4181-aad5-
a0ab7a925779/which-one-to-chose-model-first-code-first-or-db-first
NHibernate Queries
http://stackoverflow.com/questions/3262642/nhibernate-hql-vs-criteriaapi-vs-queryover-vs-linq-
performance
Frameworks ORM para .Net
http://www.princiweb.com.br/blog/programacao/veja-o-que-e-orm-e-os-frameworks-disponiveis-
para-net/
Manual NHibernate
http://nhforge.org/doc/nh/en
Blog do Ayende
http://ayende.com/blog/

Mais conteúdo relacionado

PPTX
Padrões MVC
PDF
pgModeler: muito mais que um modelador de bancos de dados PostgreSQL
PPT
Bancos de Dados Orientados a Objeto
PPT
Introdução a JPA e Hibernate - TDC 2012
PDF
Introdução ao JPA com Hibernate
PDF
It skills para rh aprender e contratar
PPTX
PDF
Persistência com JPA usando o NetBeans 7
Padrões MVC
pgModeler: muito mais que um modelador de bancos de dados PostgreSQL
Bancos de Dados Orientados a Objeto
Introdução a JPA e Hibernate - TDC 2012
Introdução ao JPA com Hibernate
It skills para rh aprender e contratar
Persistência com JPA usando o NetBeans 7

Destaque (11)

PPTX
.NET Database Toolkit
PPTX
PDF
Dapper & Dapper.SimpleCRUD
PDF
PPTX
MVC - Introduction
PPTX
C# 6.0 - What?! C# is being updated?
PPT
0. Course Introduction
PPT
14. Defining Classes
PPT
08. Numeral Systems
PPT
20. Object-Oriented Programming Fundamental Principles
PPT
17. Trees and Graphs
.NET Database Toolkit
Dapper & Dapper.SimpleCRUD
MVC - Introduction
C# 6.0 - What?! C# is being updated?
0. Course Introduction
14. Defining Classes
08. Numeral Systems
20. Object-Oriented Programming Fundamental Principles
17. Trees and Graphs
Anúncio

Semelhante a Treinamento ORM .Net (20)

PDF
Uma implementação de suporte a
ODP
Processos iniciais do mapeamento OR
PDF
Palestra Desenvolvimento Ágil para Web com ROR UVA
PDF
Criando Jogos 2D com Lua + Corona SDK
PPTX
Banco de dados orientados a objetos
ODP
Apresentação java
PDF
Google AppEngine: Desafios da adoção de cloud no mercado de seguros
PPTX
PDF
Palestra Zend Framework na Campus Party 2011
PDF
XML Schema (2002)
PPTX
04_-_POSTGRESQsahajajakakakakskkskL.pptx
PDF
ODP
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
PDF
Aulas Google Android
PDF
Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...
PDF
Hibernate conceitos
KEY
Utilizando NoSQL no desenvolvimento de soluções inteligentes
PDF
Apresentação Banco de Dados - Caché
PDF
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
PDF
Escalabilidade, as modas, (No)SQL
Uma implementação de suporte a
Processos iniciais do mapeamento OR
Palestra Desenvolvimento Ágil para Web com ROR UVA
Criando Jogos 2D com Lua + Corona SDK
Banco de dados orientados a objetos
Apresentação java
Google AppEngine: Desafios da adoção de cloud no mercado de seguros
Palestra Zend Framework na Campus Party 2011
XML Schema (2002)
04_-_POSTGRESQsahajajakakakakskkskL.pptx
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Aulas Google Android
Paradigmas de Linguagens de Programação - Quatro Paradigmas + Ambientes de Pr...
Hibernate conceitos
Utilizando NoSQL no desenvolvimento de soluções inteligentes
Apresentação Banco de Dados - Caché
[DTC21] Lucas Gomes - Do 0 ao 100 no Big Data
Escalabilidade, as modas, (No)SQL
Anúncio

Último (7)

DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
PDF
Evolução em código: algoritmos genéticos com PHP
PPTX
Mapeamento de Objeto para Tabela Relacional
PDF
apresentacao introducao computacao ead.pdf
PPTX
Curso de Windows 11 resumido na prática.pptx
PDF
Dos requisitos ao código: como criar código rastreável em PHP
DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
Evolução em código: algoritmos genéticos com PHP
Mapeamento de Objeto para Tabela Relacional
apresentacao introducao computacao ead.pdf
Curso de Windows 11 resumido na prática.pptx
Dos requisitos ao código: como criar código rastreável em PHP
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO

Treinamento ORM .Net

  • 2. Persistência "Na ciência da computação, persistência refere a característica de estado que sobrevive além do processo no qual é criado. Sem esta capacidade, o estado existirá apenas na memória RAM, e pode se perder quando ocorrer a interrupção da alimentação de energia, como quando o computador é desligado." - Wikipedia
  • 3. Mundo OO Persistência é uma necessidade primária de aplicações. Em algum momento é necessário armazenar dados, inclusive em aplicações OO. Gerenciadores de Banco de Dados OO: ● Caché ● db4o ● ObjectDB
  • 4. Realidade ● Persistência apoiada em gerenciadores não OO, normalmente relacionais; ● Produtos e marcas fortes no mercado, como: Microsoft SQL Server, Oracle, MySQL; ● Legado: regras de negócio escritas para o SGBD; ● Padronização da SQL; ● Investimentos altíssimos em SQL;
  • 5. Solução "Object-relational mapping (ORM, O/RM, and O/R mapping) in computer software is a programming technique for converting data between incompatible type systems in object- oriented programming languages. This creates, in effect, a "virtual object database" that can be used from within the programming language. There are both free and commercial packages available that perform object-relational mapping, although some programmers opt to create their own ORM tools." - Wikipedia
  • 6. Vantagens ● Um monte de tarefas relativas a banco de dados é feita automaticamente. ● Nem todo mundo escreve bons codigos SQL, o ORM escreve SQL padronizado. ● Iniciar transações, usar comandos preparados, etc é simples como chamar um método. ● Se encaixa naturalmente ao estilo de código corrente. ● Abstrai o banco de dados. ● O model fica fracamente acoplado ao código de infra para banco. ● Permite uso de vantagens OOP como herança no model sem dor de cabeça.
  • 7. Desvantagem ● Curva de aprendizado; ● Performance; (vs. master SQL dev)
  • 8. Mapeamentos São conhecidas as seguintes estratégias de mapeamento: ● Propriedades ● Um para um; ● Um para muitos; ● Muitos para muitos; ● Componentes ● Herança;
  • 13. Estratégia 1 Single table per class hierarchy strategy Uma única tabela mantém todas as instâncias da hierarquia.
  • 14. Estratégia 2 Joined subclass strategy Uma tabela por classe e subclasse. Cada tabela mantém as propriedades de uma subclasse específica.
  • 15. Estratégia 3 Table per class strategy Uma tabela por classe concreta.
  • 16. Outros aspectos ● Cascade ● Associação Unidirecional/Bidirecional ● Query Language ● Mapping ● Unit of work ● Lazy Load ● Query Object
  • 17. Abordagens ● Model First ● Code First ● Data Base First
  • 18. NHibernate O NHibernate é um ORM Open-Source, que surgiu através do Hibernate, voltado exclusivamente para desenvolvedores Java, sendo a princípio era um port do Hibernate, mas passou a ser um projeto independente. Sendo assim, apresenta uma certa maturidade, principalmente por ser um framework com uma equipe colaborando ativamente.
  • 19. Mapping ● XML ● Atributos ● FluentNHibernate ● Code Mapping
  • 20. XML <hibernate-mapping> <class entity-name="Customer"> <id name="id" type="long" column="ID"> <generator class="sequence"/> </id> <property name="name" column="NAME" type="string"/> <property name="address" column="ADDRESS" type="string"/> <many-to-one name="organization" column="ORGANIZATION_ID" class="Organization"/> <bag name="orders" inverse="true" lazy="false" cascade="all"> <key column="CUSTOMER_ID"/> <one-to-many class="Order"/> </bag> </class> </hibernate-mapping>
  • 21. Atributos [Class(Schema = "dbo", Table = "`ProgramRequirements`")] [Cache(1, Usage = CacheUsage.ReadWrite)] public class ProgramRequirements : NhBase<ProgramRequirements> { [Id(Name = "Id", Column = "ID"), Generator(1, Class = "native")] public virtual int Id { get; set; } [ManyToOne(Column = "DeptID", OuterJoin = OuterJoinStrategy.False)] public virtual Department Department { get; set; } [ManyToOne(Column = "ProgID", OuterJoin = OuterJoinStrategy.False)] public virtual Program Program { get; set; } [Property(Column = "ProgReqTypeID")] public virtual ProgramRequirementsType RequirementsType { get; set; } [Property] public virtual string Name { get; set; } [Property] public virtual string Description { get; set; } }
  • 22. Fluent NHibernate public class PedidoMap : ClassMap<Pedido> { public PedidoMap() { Table("Orders"); Id(x => x.Id).Column("OrderID").Not.Nullable().GeneratedBy.Identity(); Map(x => x.DataPedido).Column("OrderDate"); Map(x => x.DataSolicitacao).Column("RequiredDate"); Map(x => x.DataEntrega).Column("ShippedDate"); Map(x => x.Frete).Column("Freight"); Map(x => x.NomeEntrega).Column("ShipName"); Map(x => x.EnderecoEntrega).Column("ShipAddress"); Map(x => x.CidadeEntrega).Column("ShipCity"); Map(x => x.RegiaoEntrega).Column("ShipRegion"); Map(x => x.CodigoPostalEntrega).Column("ShipPostalCode"); Map(x => x.PaisEntrega).Column("ShipCountry"); HasMany(x => x.Itens).KeyColumns.Add("OrderID", mapping => mapping.Name("OrderID").Not.Nullable()); References(x => x.Cliente).Columns("CustomerID").Cascade.None(); References(x => x.Empregado).Columns("EmployeeID").Cascade.None(); References(x => x.Entregador).Columns("ShipVia").Cascade.None(); } }
  • 23. Code Mapping public class DogMap : ClassMapping<Dog> { public DogMap() { Table("Dog"); Id(x => x.Id, m => m.Generator(Generators.Identity)); Property(x => x.Name); Property(x => x.Age); } }
  • 24. Queries ● SQL Nativo ● HQL ● Criteria ● QueryOver ● Linq
  • 25. SQL Nativo IList cats = session.CreateSQLQuery( "SELECT {cat.*} FROM CAT {cat} WHERE ROWNUM<10", "cat", typeof(Cat) ).List();
  • 26. HQL IList cats = sess.Find( "from Cat as cat where cat.Mate.Birthdate is null" );
  • 27. Criteria ICriteria crit = session.CreateCriteria(typeof(Cat)); crit.Add( Expression.Eq("color", Eg.Color.Black) ); crit.SetMaxResults(10); IList cats = crit.List();
  • 28. Query Over IList<Cat> cats = session.QueryOver<Cat>() .Where(c => c.Name == "Max") .List();
  • 29. Linq var user = from u in session.Query<User>() where u.Username == username select u; var user = session.Query<User>().Where(u => u.Username == username);
  • 31. Recursos Argumentos OODB vs RDB http://stackoverflow.com/questions/800/object-oriented-vs-relational-databases http://www.leavcom.com/db_08_00.htm Sobre model/code/database first http://social.msdn.microsoft.com/Forums/en-US/eb695b8b-0638-4181-aad5- a0ab7a925779/which-one-to-chose-model-first-code-first-or-db-first NHibernate Queries http://stackoverflow.com/questions/3262642/nhibernate-hql-vs-criteriaapi-vs-queryover-vs-linq- performance Frameworks ORM para .Net http://www.princiweb.com.br/blog/programacao/veja-o-que-e-orm-e-os-frameworks-disponiveis- para-net/ Manual NHibernate http://nhforge.org/doc/nh/en Blog do Ayende http://ayende.com/blog/