Escolar Documentos
Profissional Documentos
Cultura Documentos
ao NHibernate como ferramenta de O/RM alternativa Principais capacidades Comparativo com outros O/RMs Projectos relacionados Q&As a qualquer altura
O que o NHibernate?
Um O/RM carrega dados de tabelas de bases de dados para objectos .NET e vice-versa Com o NHibernate, focamos-nos nas classes, no na base de dados at pode ser gerada para ns Construdo pela comunidade, inspirado pelo Java Hibernate
O que o NHibernate no ?
Uma framework de desenvolvimento genrica Um API de regras de negcio Uma ferramenta de ETL ou inseres em massa
Independente da base de dados As tabelas so geradas e actualizadas a partir das classes No requer classes ou interfaces base (POCO) Suporta uma abordagem Domain-Driven Design Lazy loading de entidades associadas, coleces e propriedades Deteco automtica de alteraes nas entidades SQL ou stored procedures podem ser usados em todas as operaes Mltiplos geradores de chaves primrias Muitas opes para controlo de concorrncia API extensvel Open source Baseado em Design Patterns
Copyright (c) Ricardo Peres 2010
BD
Domain-Driven
Design:
An approach to developing software for complex needs by deeply connecting the implementation to an evolving model of the core business concepts
OR/M:
A programming technique for converting data between incompatible type systems in relational databases and object-oriented programming languages
Wikipedia
Active Record:
An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data
Data Mapper:
A layer of Mappers that moves data between objects and a database while keeping them independent of each other and the mapper itself
Dependent Mapping:
Has one class perform the database mapping for a child class
Domain Model:
An object model of the domain that incorporates both behavior and data
Embedded Value:
Maps an object into several fields of another object's table
Identity Field:
Saves a database ID field in an object to maintain identity between an inmemory object and a database row
Identity Map:
Ensures that each object gets loaded only once by keeping every loaded object in a map. Looks up objects using the map when referring to them
Inheritance Mappers:
A structure to organize database mappers that handle inheritance hierarchies
Lazy Load:
An object that doesn't contain all of the data you need but knows how to get it
Metadata Mapping:
Holds details of object-relational mapping in metadata
Mapper:
An object that sets up a communication between two independent objects
Query Object:
An object that represents a database query
Unit of Work:
Maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems
Value Object:
A small simple object, like money or a date range, whose equality isn't based on identity
DB2 Ingres PostgreSQL 7+ MySQL 3+ Oracle 8+ Sybase Adaptive Server Enterprise Sybase Adaptive Server Anywhere SQL Server 7+ (including Azure) Firebird SQLLite Ingres 3+ Azure Genrica (SQL 99) Bases de dados personalizadas
Copyright (c) Ricardo Peres 2010
Ficheiros HBM.XML
Classes so POCO, sem referncias ao NHibernate Podem ou no ser includos como embedded resources
Atributos
So aplicados atributos nas classes e propriedades
Fluent NHibernate
Classes so POCO, sem referncias ao NHibernate API fluente
As entidades no so tabelas e as propriedades no so colunas! O NHibernate constroi o modelo em memria e pode gerar os scripts DDL de criao
Copyright (c) Ricardo Peres 2010
NHibernate suporta uma abordagem model-first (primeiro as classes, depois a BD) Nesta abordagem, a persistncia apenas um aspecto, o modelo simplesmente POCO, sem preocupaes de como os dados vo ser persistidos Alguns conceitos so: entidades (com chave) e valores (sem chave), agregados e associaes
Copyright (c) Ricardo Peres 2010
Misto (join)
Copyright (c) Ricardo Peres 2010
Demo
Mapeamento de Heranas
One to One
em
cada
Many to Many
Coleco extremos
extremo,
Id Bag
Identificador por relao
ambos
os
List
Lista ordenada com uma coluna indexadora de tipo inteiro
Ternary
No preciso uma classe base, apenas uma propriedade conhecida Muitos para um ou um para muitos ou muitos para muitos onde o indexador uma entidade
Set
Sem repetio de elementos
Map
Elementos ordenados indexados por uma coluna de qualquer tipo, incluindo entidades
Propsito Independente da BD SQL Server, MySQL, DB2, Sybase Oracle, PostgreSQL, DB2, Firebird Independente da BD, precisa de uma tabela especial Precisa de uma tabela especial Identity, Sequence or Hi / Lo, dependendo da BD GUID, independente da BD
GUID
GUID Comb Assigned Foreign
GUID, independente da BD
GUID, independente da BD Independente da BD Entidade um para um relacionada a chave
Join fetching
usado um JOIN para obter as entidades associadas
Select fetching
usado um segundo SELECT para obter as entidades seleccionadas
Subselect fetching
usado um segundo SELECT para obter as entidades seleccionadas
Proxy fetching
Uma entidade associada carregada quando uma das suas propriedades no chave acedida
Lazy properties
Uma propriedade individual carregada quando acedida (para CLOBs ou BLOBs)
As
session factories (ISessionFactory) so criadas por objectos Configuration (um por aplicao) As sesses so criadas por session factories Tipicamente apenas uma session factory necessria, mas podem ser criadas vrias, a apontar para BDs diferentes As session factories so pesadas, contm todo o modelo Thread-safe
Copyright (c) Ricardo Peres 2010
Todo o acesso BD feito atravs de sesses (pattern Unit of Work) Dois tipos de sesses:
Normal (ISession) Stateless (IStatelessSession):
No No No No suporta lazy loading reconhece as alteraes levanta eventos usa a cache
As conexes BD apenas so abertas quando necessrio So leves e no thread-safe Todas as operaes so feitas numa sesso As entidades carregadas por uma sesso esto presas a ela, mas podem ser desligadas e ligadas a outra
Copyright (c) Ricardo Peres 2010
Get / Load: carregar uma entidade / proxy Refresh: refrescar uma entidade Save / Update / SaveOrUpdate: guardar uma entidade SaveOrUpdateCopy: igual a SaveOrUpdate, mas funciona com entidades no persistidas Merge: copia o estado de uma entidade no persistida para uma entidade persistida com o mesmo id Persist: torna uma entidade persistente Delete: apagar uma entidade Replicate: guardar uma entidade numa nova BD Lock / Unlock: bloquear / desbloquear uma entidade Evict / Clear: remover uma entidade / todas as entidades da cache de primeiro nvel
Demo
ID
Por chave primria
Named Queries
Queries pr-compiladas, HQL ou SQL
HQL
Independente da BD, similar a SQL mas object-oriented
LINQ
Querying fortemente tipado
Criteria API
Usa objectos para representar as condies de filtragem, projeces, ordenamento, joins, etc (Query Object pattern)
SQL
SQL
NHibernate Search
Integrao com Lucene.NET
Por Exemplo
Dado uma entidade exemplo com alguns valores nas suas propriedades, procura entidades similares
Query Over
Idntico ao Criteria API mas usando expresses LINQ
LINQ to NHibernate
var cats = from a in session.Query<Cat> where a.Id = 1 select a;
HQL
var cats = session.CreateQuery<Cat>(from Cat c where id(c) = 1).List<Cat>(); var cats = new DetachedQuery(from Cat c where id = 1).GetExecutableQuery(session).List <Cat>();
Criteria API
var cats = session.CreateCriteria<Cat>(). Add(Restrictions.IdEq(1)).List<Cat>()
Query Over
var cats = QueryOver.Of<Cat>().Where(a => a.Id == 1).GetExecutableQueryOver(session). List<Cat>();
Por Exemplo
Cat example = new Cat {Name = Felix}; var cats = session.CreateCriteria<Cat>().Add( Example.Create(example)).List<Cat >();
By Id
var cat = session.Get<Cat>(1); var catProxy = session.Load<Cat>(1);
Named Queries
var cats = session.GetNamedQuery(GetCats").S etParameter(name", Felix).List<Cat>();
SQL
var cats = session.CreateSQLQuery(SELECT * FROM cat WHERE id = 1).List<Cat>();
NHibernate Search
var cats = searchSession.CreateFullTextQuery <Cat>(Id:1").List<Cat>();
session.CreateMultiQuery().Add<C at>(from Cat c where c.Name = Felix).Add<Cat>(from Cat c where c.Name = Tom).List(); var cats = session.CreateMultiCriteria().Add< Cat>(Restrictions.Eq(Name, Felix)).Add<Cat>(Restrictions.Eq( Name, Tom)).List(); var futureCats = session.CreateQuery(from Cat c where c.Name = Felix).Future<Cat>(); var futureCats = session.CreateCriteria<Cat>(Restri ctions.Eq(Name, Felix)).Future<Cat>();
possvel deferir a execuo de uma query para um momento posterior Podem ser chamadas tanto queries que devolvem listas como um nico elemento: Future<T> e FutureValue<T> As queries futuras so todas enviadas em bloco Suportadas em SQL Server, SQL Server CE, MySQL, PostgreSQL e SQLLite
Podem
ser especificados filtros para entidades e coleces Um filtro pode estar activado (inicialmente esto desactivados) ou no e ter um ou mais valores (filtro composto) Um filtro tem um tipo associado Especificados nos ficheiros de mapeamento
Demo
Copyright (c) Ricardo Peres 2010
Querying
As alteraes em entidades so detectadas automaticamente, o NHibernate sabe quando um objecto mudou (snapshot) O NHibernate tambm sabe se um objecto veio da BD ou no Podem ser usados stored procedures para todas as operaes DML e para carregar entidades (loader, sqlinsert, sql-update, sql-delete, sql-query, sql-delete-all) Podem ser especificadas regras de cascata para todas as coleces associadas (all, none, save-update, all-deleteorphan) Pode ser usado HQL para todas as operaes DML (INSERT, UPDATE, DELETE)
Copyright (c) Ricardo Peres 2010
Todas as operaes DML so suportadas (UPDATE, DELETE, INSERT) Pode ser especificado o batch-size para aplicao em bloco Podem ser gerado SQL apenas para as colunas modificadas (dynamic-update) As alteraes so aplicadas (flushed) em determinados momentos O flushing configurvel por sesso:
No commit (FlushMode.Commit) Automaticamente (FlushMode.Auto) Em todas as queries (FlushMode.Always) Nunca (FlushMode.Never) Copyright (c) Ricardo Peres 2010
Uma transaco deve ser sempre criada Um ou mais registos podem ser explicitamente bloqueados (Lock) lanada uma excepo no caso de uma violao de concorrncia
Interceptors recebem notificaes quando certos eventos ocorrem Cancelar uma operao (delete, update, insert) possvel pelo retorno de um valor de veto Apenas um interceptor por sesso
Listeners recebem notificaes quando certos eventos ocorreram ou vo ocorrer Apenas possvel cancelar lanando uma excepo O NHibernate Validator depende de listeners
Interceptors (IInterceptor) e listeners (IxxxListener) podem ser aplicados ao nvel da session factory ou da sesso Outra opo consiste em implementar as interfaces IValidator e ILifecycle Um listener pode ser registado em cdigo ou no ficheiro .config
Auto-Flush Create Create-OnFlush Delete Dirty-Check Evict Flush Flush-Entity Load Load-Collection Lock Merge Pre-Update Post-Load Post-Insert Post-Update Post-Delete
Post-Commit-Delete Post-Commit-Insert Post-Commit-Update Pre-Load Pre-Delete Pre-Insert Pre-Collection-Recreate Pre-Collection-Remove Pre-Collection-Update Post-Collection-Recreate Post-Collection-Remove Post-Collection-Update Refresh Replicate Save Save-Update Update
Demo
Interceptors e Listeners
possvel definir carregadores para tipos personalizaos (tipos simples, IUserType, tipos compostos, ICompositeUserType), com os quais o NHibernate no sabe lidar (imagens, por exemplo) Em tipos compostos at possvel fazer queries pelas propriedades declaradas nos tipos personalizados
Copyright (c) Ricardo Peres 2010
Demo
Tipos Personalizados
Associada
sesso As sesses stateless no usam CPN Pode ser desactivado em sesses normais As entidades carregadas so colocadas na CPN, e posteriormente so sempre da obtidas (excepto quando forem refrescadas) Uma implementao do pattern Identity Map
Copyright (c) Ricardo Peres 2010
Associada session factory Activada entidade a entidade Aplica-se tanto a entidades como a queries Vrios fornecedores disponveis (NHContrib):
Descrio
Uses System.Web.Caching.Cache as the cache provider Similar to NHibernate.Caches.SysCache, uses ASP.NET cache plus SQL dependencies uses Bamboo.Prevalence as the cache provider, a .NET implementation of the object prevalence concept brought to life by Klaus Wuestefeld in Prevayler Uses memcached, a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. Basically a distributed hash table Uses Microsoft Velocity which is a highly scalable in-memory application cache for all kinds of data High-performance, distributed and replicated memory object caching system
Fornecedor
SysCache SysCache 2 Prevalence MemCache
Velocity SharedCache
Projecto NHibernate Attributes (NHContrib) NHibernate Search (NHContrib) NHibernate Validator (NHContrib) NHibernate Burrow (NHContrib) NHibernate Caches (NHContrib) NHibernate Proxy Generators (NHContrib) NHibernate Spatial (NHContrib)
Descrio Mapeamento por atributos Integrao com Lucene.NET Validao de estado Conversaes e persistncia entre pedidos em aplicaes web Fornecedores de cache de 2 nvel Pr-gerao de classes proxy Suporte para tipos de dados georeferenciados (SQL Server, PostgreSQL)
Microsoft
Non-Microsoft
Castle ActiveRecord
Open Source Baseado no NHibernate Faz algumas assumpes sobre o modelo No POCOs Todas as estratgias de mapeamento de heranas so suportadas
SubSonic
Gratuito POCOs e no POCOs SQL Server, Oracle, MySQL, PostgreSQL, Vista DB, SQL Server CE e SQL Lite Apenas BD primeiro Apenas suporta a estratgia table per class hierarchy Comercial Mltiplas BDs suportadas No POCOs Apenas BD primeiro Apenas suporta a estratgia table per class hierarchy
LLBLGen Pro
Uma
framework O/RM matura Altamente extensvel Vasta comunidade de utilizadores Projectos relacionados muito interessantes Capaz de ombrear com outros produtos O/RM estabelecidos
Ayende @ Rahien Bamboo.Prevalence Catalog of Patterns of Enterprise Application Architecture First and Second Level Caching in NHibernate Fluent NHibernate NHibernate Forge HunabKu Memcached NHibernate Contrib NHibernate Mapping - Inheritance NHibernate Users Mailing List uNhAddins Using NHibernate With Stored Procedures Velocity (AppServer Fabric Caching)
Copyright (c) Ricardo Peres 2010
Q&A
Copyright (c) Ricardo Peres 2010