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/

Treinamento ORM .Net

  • 1.
  • 2.
    Persistência "Na ciência dacomputaçã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 apoiadaem 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 montede 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 deaprendizado; ● Performance; (vs. master SQL dev)
  • 8.
    Mapeamentos São conhecidas asseguintes estratégias de mapeamento: ● Propriedades ● Um para um; ● Um para muitos; ● Muitos para muitos; ● Componentes ● Herança;
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
    Estratégia 1 Single tableper class hierarchy strategy Uma única tabela mantém todas as instâncias da hierarquia.
  • 14.
    Estratégia 2 Joined subclassstrategy Uma tabela por classe e subclasse. Cada tabela mantém as propriedades de uma subclasse específica.
  • 15.
    Estratégia 3 Table perclass 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 classPedidoMap : 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 classDogMap : 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);
  • 30.
  • 31.
    Recursos Argumentos OODB vsRDB 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/