This document provides an introduction to object-relational mapping (ORM) and NHibernate. It discusses ORM techniques for converting data between object-oriented programming languages and relational databases. The document then provides an overview of NHibernate, an open source ORM framework for .NET, including its basic concepts, configuration, querying capabilities, and additional reading.
4. Object-relational mapping (aka ORM, O/RM, and O/R
mapping) is a programming technique for converting data
between incompatible type systems in relational databases
and object-oriented programming languages (Wikipedia)
Objects are hierarchical
Databases are relational
ORM
Objects Relational
4
5. Performance or Scalability
Productivity: less code to write/maintain
Abstraction: transient to different DB technologies
Simplification and Consistency
Quality: depending on the product
5
6. ADO.NET Entity Framework (released with .NET 3.5 SP1)
Business Logic Toolkit for .NET
Castle ActiveRecord
IBatis.Net
LightSpeed
Linq (Language Integrated Query)
LLBLGen
LLBLGen Pro
NHibernate
Neo …etc
6
8. Initially developed for Java
created in late 2001 by Gavin King
absorbed by the JBoss Group / Red Hat
Ported to .NET 1.1, 2.0, 3.5
Resulting product called “NHibernate”
All popular databases supported
Oracle, SQL Server, DB2, SQLite, PostgreSQL,
MySQL, Sybase, Firebird, …
XML-based configuration files
Good community support
Free/open source - NHibernate is licensed under the
LGPL (Lesser GNU Public License)
8
13. <class> declare a persistent class
<id> defines the mapping from that property to the
primary key column
Specifies strategy
<property> declares a persistent property of the class
<component> maps properties of a child object to
columns of the table of a parent class.
Associations
One-to-Many
Many-to-One
Many-to-Many
One-to-One (uncommon)
13
14. Element Description .NET Type
<set> An unordered collection Iesi.Collections.ISet
that does not allow Iesi.Collections.Generic.ISet<T>
duplicates.
<list> An ordered collection that System.Collections.IList
allows duplicates System.Collections.Generic.IList<T>
<bag> An unordered collection System.Collections.IList
that allow duplicatd System.Collections.Generic.IList<T>
14
17. Pros
Simple approach
Easy to add new classes, you just need to add new
columns for the additional data
Data access is fast because the data is in one table
Ad-hoc reporting is very easy because all of the data
is found in one table.
Cons
Coupling within the class hierarchy is increased
because all classes are directly coupled to the same
table. A change in one class can affect the table
which can then affect the other classes in the
hierarchy
Space potentially wasted in the database
Table can grow quickly for large hierarchies. 17
19. Pros
Easy to understand because of the one-to-one
mapping
Very easy to modify superclasses and add new
subclasses as you merely need to modify/add one
table
Data size grows in direct proportion to growth in the
number of objects.
Cons
There are many tables in the database, one for every
class (plus tables to maintain relationships)
Potentially takes longer to read and write data using
this technique because you need to access multiple
tables
Ad-hoc reporting on your database is difficult, unless
you add views to simulate the desired tables. 19
21. Pros
Easy to do ad-hoc reporting as all the data you need
about a single class is stored in only one table
Good performance to access a single object’s data.
Cons
When you modify a class you need to modify its table
and the table of any of its subclasses.
21
24. Object oriented querying
Increase compile-time syntax-checking
Easy to write
Hard to read
ICriteria crit = sess.CreateCriteria(typeof(Cat));
crit.SetMaxResults(50);
List topCats = crit.List();
IList cats = sess.CreateCriteria(typeof(Cat))
.Add( Restrictions.Like(quot;Namequot;, quot;Fritz%quot;))
.Add( Restrictions.Between(quot;Weightquot;, minWeight,
maxWeight))
.List();
24
25. String based querying
Object-Oriented SQL
Similar to SQL
Speak in terms of objects
Case sensitive
Very flexible
Zero compile-time syntax-checking
• from Customer c where c.Name like :name
• select count(*) from Customer c
25
26. Powerful way to (simply) return a group of like objects
from the DB.
Wonderfully simple to work with
Great way to quickly process a “…where
A=<something> and B=<something> and
C=<something>…”
Cat cat = new Cat();
cat.Sex = 'F';
cat.Color = Color.Black;
List results = session.CreateCriteria(typeof(Cat))
.Add( Example.Create(cat) )
.List();
26
27. You can submit SQL statements to NHibernate if the
other methods of querying a database do not fit your
needs
utilize database specific features
• sess.CreateSQLQuery(quot;SELECT * FROM CATSquot;)
.AddScalar(quot;IDquot;, NHibernateUtil.Int32)
.AddScalar(quot;NAMEquot;, NHibernateUtil.String)
.AddScalar(quot;BIRTHDATEquot;, NHibernateUtil.Date);
• sess.CreateSQLQuery(quot;SELECT * FROM CATSquot;)
.AddEntity(typeof(Cat));
27