Você está na página 1de 49

Introduo

ao NHibernate como ferramenta de O/RM alternativa Principais capacidades Comparativo com outros O/RMs Projectos relacionados Q&As a qualquer altura

Copyright (c) Ricardo Peres 2010

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

Copyright (c) Ricardo Peres 2010

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

Aplicao Apresentao Negcio O/RM

BD

Copyright (c) Ricardo Peres 2010

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

Copyright (c) Ricardo Peres 2010

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

Association Table Mapping:


Saves an association as a table with foreign keys to the tables that are linked by the association

Class Table Inheritance:


Represents an inheritance hierarchy of classes with one table for each class

Concrete Table Inheritance:


Represents an inheritance hierarchy of classes with one table per concrete class in the hierarchy

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

Martin Fowler, Patterns of Enterprise Application Integration


Copyright (c) Ricardo Peres 2010

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

Foreign Key Mapping:


Maps an association between objects to a foreign key reference between tables

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

Martin Fowler, Patterns of Enterprise Application Integration

Copyright (c) Ricardo Peres 2010

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

Optimistic Offline Lock:


Prevents conflicts between concurrent business transactions by detecting a conflict and rolling back the transaction

Pessimistic Offline Lock:


Prevents conflicts between concurrent business transactions by allowing only one business transaction at a time to access data

Query Object:
An object that represents a database query

Martin Fowler, Patterns of Enterprise Application Integration

Copyright (c) Ricardo Peres 2010

Single Table Inheritance:


Represents an inheritance hierarchy of classes as a single table that has columns for all the fields of the various classes

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

Martin Fowler, Patterns of Enterprise Application Integration

Copyright (c) Ricardo Peres 2010

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

Table per Class Hierarchy (discriminator + subclass)


Uma tabela contm todas as colunas para todas as sub-classes Classes diferentes so distinguidas por uma coluna discriminatria

Table per Subclass (joined-subclass)


Uma tabela para cada classe me e uma para cada sub-classe A tabela para a classe me contm as colunas partilhadas

Table per Concrete Class (union-subclass)


Uma tabela para cada classe concreta Cada tabela contm todas as colunas de todas as sub-classes As chaves nunca podem ser iguais

Misto (join)
Copyright (c) Ricardo Peres 2010

Demo

Mapeamento de Heranas

Copyright (c) Ricardo Peres 2010

One to One

One to Many / Many to One

Uma entidade extremo

em

cada

Many to Many
Coleco extremos

Coleco num entidade no outro em

extremo,

Property Array Primitive Array Bag


No ordenado com repetio

Id Bag
Identificador por relao

ambos

os

List
Lista ordenada com uma coluna indexadora de tipo inteiro

Any / Many to Any

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

Copyright (c) Ricardo Peres 2010

Gerador Increment Identity Sequence Hi / Lo Sequence Hi / Lo Native UUID String

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

Lazy collection fetching


A coleco carregada como um todo quando acedida

Select fetching
usado um segundo SELECT para obter as entidades seleccionadas

Extra-lazy collection fetching


Cada um dos elementos de uma coleco carregado da BD quando acedido

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)

Copyright (c) Ricardo Peres 2010

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

Copyright (c) Ricardo Peres 2010

Demo

Session Factories e Sesses

Copyright (c) Ricardo Peres 2010

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

Copyright (c) Ricardo Peres 2010

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>();

var cats = DetachedCriteria.For<Cat>().Add(Res trictions.IdEq(1)).GetExecutableCriter ia(session).List<Cat>();

Copyright (c) Ricardo Peres 2010

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>();

Copyright (c) Ricardo Peres 2010

NHibernate Search
var cats = searchSession.CreateFullTextQuery <Cat>(Id:1").List<Cat>();

Multi Criteria / Multi Query / Futures var cats =

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

Copyright (c) Ricardo Peres 2010

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

Copyright (c) Ricardo Peres 2010

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

Vrias estratgias de controlo de concorrncia:


Pessimista: lock de registos ou tabela, especfico da BD Optimista:
Verso: numrico, data e hora, ROWVERSION (SQL Server) Todos/Sujos: todos os campos ou apenas os modificados Propriedades individuais podem ser configuradas para entrar no controlo de concorrncia

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

Copyright (c) Ricardo Peres 2010

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

AfterTransactionBegin AfterTransactionCompleti on BeforeTransactionComple tion OnCollectionRecreate OnCollectionRemove OnCollectionUpdate OnDelete

OnFlushDirty OnLoad OnPrepareStatement OnSave PostFlush PreFlush

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

Copyright (c) Ricardo Peres 2010

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

Copyright (c) Ricardo Peres 2010

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)

NHibernate Shards (NHContrib)


NHibernate User Types (NHContrib) NHibernate Tasks (HBM to .NET, HBM to DDL) (NHContrib)

Particionamento horizontal de BDs


Tipos de dados especficos do Oracle e SQL Server Gerao de classes .NET a partir dos mapeamentos HBM.XML

Microsoft

Non-Microsoft

Microsoft LINQ to SQL


Gratuito POCOs Apenas SQL Server Physical mapping to tables, not a conceptual model Apenas BD primeiro Apenas suporta a estratgia table per class hierarchy

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

Microsoft Entity Framework


Gratuito Por agora, apenas SQL Server, Oracle e MySQL so possveis POCOs e no POCOs Modelo conceptual Cdigo primeiro ou BD primeiro Todas as estratgias de mapeamento de heranas so suportadas

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

Copyright (c) Ricardo Peres 2010

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

Ricardo Peres rjperes@criticalsoftware.com http://weblogs.asp.net/ricardoperes http://pontonetpt.com/blogs/ricardoperes

Copyright (c) Ricardo Peres 2010

Q&A
Copyright (c) Ricardo Peres 2010

A sua opinio importante! Complete o questionrio de avaliao e devolva-o saida.

Copyright (c) Ricardo Peres 2010

Copyright (c) Ricardo Peres 2010

Copyright (c) Ricardo Peres 2010

Você também pode gostar