NHibernate in Action (Parte 2)

Post on 19-Jun-2015

97 views 2 download

description

La persistenza delle entity del domain model è, a dispetto dell'apparente semplicità, un task applicativo che nasconde molteplici problematiche. Perché allora non avvalersi di quello che, attualmente, è il più utilizzato framework di persistenza al mondo? NHibernate consente di sfruttare al meglio le tecnologie di accesso ai dati, di minimizzare la scrittura di codice e di evitare quindi errori inutili. In una frase, aumentare la nostra produttività. Introduzione al Domain Model Domain Model e modello E/R: Paradigm Mismatch Nasce l'esigenza di un ORM: Introduzione al progetto NH Architettura di NHibernate: le factory, la session, e le entity Demo: Configurazione, Il file di mapping, e un esempio con un Oggetto di dominio semplice Demo: Dirty Checking, Optimistic Lock, e Unit of Work (IndentityMap e Transparent Write Behind) Presentazione e demo di NHDomain Mapper Persistenza di un grafo complesso Strategie di retrieving dei dati Esempio di architettura di un'applicazione reale Q & A

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: giancarlo.sudano@gmail.com

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