NHibernate in Action (Parte 2)
-
Upload
dotnetmarche -
Category
Technology
-
view
97 -
download
2
description
Transcript of NHibernate in Action (Parte 2)
NHIBERNATESCENARI AVANZATI...
(janky)
about me...
Giancarlo Sudano (aka janky)
Sono Software architect in Objectway
Sono tra i fondatori di GUISA (www.guisa.org)
Passione per framework OS (NHibernate, Spring.NET, CastleProject)
Blog: http://blogs.ugidotnet.org/janky
Mail: [email protected]
Domain Model: un salto di qualità
Soluzioni?
ORM: Aspetti statici - structural
1.Mapping
2.Persistenza di una Entity
3.Dirty checking
4.Trasparent Write Behind
5.Locking/Concurrency
ORM: Aspetti dinamici - behavioral
1.Persistenza Transitiva
2.Strategie di caricamento dei dati
ORM: Persistenza Transitiva
1.E’ un algoritmo ricorsivo: Tutti le istanze di oggetti “raggiungibili” da un oggetto persistente diventano anch’essi persistenti.
Top Level (root)
ORM: Lifecyle di una entity
Transient Entity
Persistent Entity
Detached Entity
Persistence Context
Database
ORM: Persistenza Transitiva
Soluzione di NHibernate:Persistence by Reachability con Cascade
Istanza IstanzaAssociazion
e
Cascade
Behaviour
ORM: Object Retrieve• Query By
Criteria• Esecuzione di
Query Type Safe e Object Oriented
• Query by example• Query prodotta a
partire da una istanza di oggetto prorotipo
• Hibernate Query Language
• Linguaggio di Intgerrogazione Object Oriented
• Interrogazione mediante SQL puro
• Risultato mappato sulle entity
QbC QbE
HQLSQL native
ORM: Strategie di Fetching
Immediate Fetching
Lazy Fetching
Eager Fetching
ORM: Immediate Fetching
1.Select successive
2.Uso della cache
3.Ottimizzazini Batch
ORM: Lazy Fetching
1.Select scatenate all’occorrenza
2.Uso di classi Proxy
ORM: Eager Fetching
1.Uso di Left Outer Join
2.Profondita delle Join
ORM: Strategie di Fetching
lazy eager
Persistence Context
E E EContext
E EContext
Context Provider
User Interface Layer
Business Layer
Data Access Layer
DAO DAO DAO
Context:
Identity MapUnit of WorkAutomatic Dirty CheckOptimistic ConcurrencyPessimistic ConcurrencyProxy per Lazy...
Scenari Applicativi
database
session(cache 1° level)
cache distribuita(2° level)
session(cache 1° level)
application application
session(cache 1° level)
cache(2° level)
application
session(cache 1° level)
application
NH: Considerazioni finali
“...Hibernate’s job is to reduce the amount of code you have to write for the most common 90 percent of use cases (common CRUD and reporting)...”
“…Hibernate’s learning curve is high at first. In our experience, a developer needs at least two to four weeks to learn the basics. Don’t jump on Hibernate one week before your project deadline. It won’t save you…”
“…Finally, use SQL, JDBC, and stored procedures for the 5 percent of use cases you can’t implement with Hibernate, such as mass data manipulation
or complex reporting queries with vendor-specific SQL functions…”
[Gavin King, Hibernate in Action]
ORM: Considerazioni
Il Domain Model agnostico al layer di persistenza...ma deve essere disegnato per “favorire” la persistenza...
Fornire Identity Field a tutte gli Entity Type
Entity che hanno delle collection devono essere definite come IList<T> (favorisce la Dependency Injection)
Evitare classi sealed per le entity che hanno bisogno di lazy (gli ORM solitamente forniscono dei proxy object)
DB: Favorite l’uso Surrogate Keys in luogo di Natural Keys, evitate Composite Keys, pensate al Versioning