Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Orm: nhibernate

Содержание

ПланORMNHibernate: BasicsNHibernate: AdvancedЧто дальше?
ORM: NHibernateИван Позняк ПланORMNHibernate: BasicsNHibernate: AdvancedЧто дальше? ORM ORMObjectRelationalMappingреляционная БД  язык программирования ORM только на .NET / Java? – нет!С++ / Java / .NET Пример проекта10 классов-моделейНеобходимо CRUD приложениеНекоторые сущности связаныНекоторые поля сущностей «сложные» В будущем нужен репортинг Вариант 1 – не используем ORM… на самом деле пишем «свой»У нас Вариант 2 – используем ORMИспользуем уже существующие решенияОграничены возможностями библиотекиПишем больше «конфигурации»Пишем меньше кодаМеньше шансов ошибиться ВыводНе использовать готовое – не вариантВариант – использовать лучшее из готовогоЧистый SQL никто не отменяет NHibernate Кратко о библиотекеОригинальная Java версия – HibernateВерсия 3.2.0Сайт http://nhforge.org Как это работаетКраткая версия Как это работает	Полная версия Сущности и их состоянияtransientpersistentdetached Сами сущностиPOCO classesСвойства вместо полейКонструктор по умолчаниюВидимость не важнаEquals / GetHashCode Динамические моделиМожно обойтись без классов моделейDictionaryВ мэппингах – entity-name у классаВ конфиге Callbacks Жизненный циклinterface ILifecyclevoid OnSave(ISession s, object id);LifecycleVeto OnSave(ISession s);LifecycleVeto OnUpdate(ISession s);LifecycleVeto OnDelete(ISession s); ВалидацияIValidatablevoid Validate();ValidationFailure exceptionВремя вызова – не гарантируется Mapping Mapping through XMLРасширение .hbm.xmlEmbedded resourceРегистрация через конфигурационный файл Дополнительные объекты БДВ mapping файлеВ классе реализующем NHibernate.Mapping.IAuxiliaryDatabaseObjectМожно параметризоватьМожно выполнять только для определенных диалектов БД CREATE TRIGGER my_trigger ...  DROP TRIGGER my_trigger Mapping Fluent NHbibernate (3.1)Пишется код для формирования mappingКонфигурируется тоже через кодПримеры Традиционный mapping:            Конфигурация через hibernate.cfg.xml       NHibernate.Connection.DriverConnectionProvider Mapping через Fluent Nhibernate:public class CatMap : ClassMap{  public CatMap() Mapping via code NHbibernate (3.2)Пишется код для формирования mappingКонфигурируется тоже через кодПримеры ModelMapper mapper = new ModelMapper();mapper.Class(m => {   m.Id(k => k.Id, Associations One-to-OnePrimary-key basedForeign-key based One-to-Many  - ISet - IList  - IDictionary - IList и  - []В коллекциях Many-to-One Many-to-Many Bi-directional associationsДва разных представления в памятиВозможные проблемы решаются с помощью inverse=“true”inverse cascade Cascadeallsave-updatedeleteall-delete-orphan Lazy initialization МеханизмВозвращается прокси а не сам объектДанные загружаются только по необходимостиВозникают проблемы если ОграниченияКласс не sealedСвойства и методы – virtualКонструктор по умолчанию не privateЕсли proxy s = sessions.OpenSession();User u = (User) s.Find( Lazy initialization и коллекцииМожно отключатьАттрибут lazy у коллекцийНе усердствовать с lazy=“false” LazyInitializationExceptionНе закрывать сессию (до завершения обработки запроса)Вызвать руками NHibernateUtil.Initialize() передав туда коллекциюПривязать Вариант получения общего кол-ва элементов в коллекции не загружая ее из базы: Inheritance 3 стратегииTable per hierarchyTable per subclassTable per classЕсли в иерархии есть абстрактные классы – abstract=true Operations Загрузка по Id.Load(object, id).Load(id).Get(id)Load – пробросит exceptionGet – вернет null Save / Update / DeleteSave ~ INSERTUpdate ~ UPDATEDelete ~ DELETESaveOrUpdate ~ КритерииSession.CreateCriteriaICriteria.Add( Restrictions. …)Restrictions: Eq / Gt / Lt / In …Но лучше – QueryOver APISession.QueryOver C использованием критериев:.Add(Restrictions.And(        Restrictions.Eq( Fetch ModeUser user = (User) session.CreateCriteria(typeof(User)) .SetFetchMode( Batch SizeНа коллекциях и классах в mapping файлах Second Level CacheRead onlyRead / WriteNon-strict Read / Write Query Cache.SetCacheable(true).SetCacheableRegion(“”)Для сброса кэша.SetForceCacheRefresh(bool)ISessionFactory.EvictQueries() Multi Criteria & QueriesМожно выполнить несколько SQL запросов за один заход к IMultiCriteria multiCrit = s.CreateMultiCriteria()  .Add(s.CreateCriteria(typeof(Item))      .Add(Expression.Gt( Работа с сессиямиМожно задать настройку hibernate.current_session_context_classТеперь можно использовать ISessionFactory.GetCurrentSession() Генерация схемыConfiguration cfg = ....;new SchemaExport(cfg).Create(false, true); Further Reading:http://nhforge.org/doc/nh/en/index.html - документацияhttp://nhforge.org/blogs/nhibernate/default.aspx - блог IKC@itransition.com @ItransitionKC
Слайды презентации

Слайд 2 План
ORM
NHibernate: Basics
NHibernate: Advanced
Что дальше?

ПланORMNHibernate: BasicsNHibernate: AdvancedЧто дальше?

Слайд 4 ORM
Object
Relational
Mapping
реляционная БД  язык программирования

ORMObjectRelationalMappingреляционная БД  язык программирования

Слайд 5 ORM только на .NET / Java? – нет!
С++

ORM только на .NET / Java? – нет!С++ / Java /

/ Java / .NET / Flex / Delphi /

Objective-C / Perl / PHP / Python / Ruby и даже VisualBasic 6.0
Альтернатива – no SQL решения

Слайд 6 Пример проекта
10 классов-моделей
Необходимо CRUD приложение
Некоторые сущности связаны
Некоторые поля

Пример проекта10 классов-моделейНеобходимо CRUD приложениеНекоторые сущности связаныНекоторые поля сущностей «сложные» В будущем нужен репортинг

сущностей «сложные»
В будущем нужен репортинг


Слайд 7 Вариант 1 – не используем ORM
… на самом

Вариант 1 – не используем ORM… на самом деле пишем «свой»У

деле пишем «свой»
У нас больше контроля
Но мы пишем больше

кода
Больше шансов ошибиться

Слайд 8 Вариант 2 – используем ORM
Используем уже существующие решения
Ограничены

Вариант 2 – используем ORMИспользуем уже существующие решенияОграничены возможностями библиотекиПишем больше «конфигурации»Пишем меньше кодаМеньше шансов ошибиться

возможностями библиотеки
Пишем больше «конфигурации»
Пишем меньше кода
Меньше шансов ошибиться


Слайд 9 Вывод
Не использовать готовое – не вариант
Вариант – использовать

ВыводНе использовать готовое – не вариантВариант – использовать лучшее из готовогоЧистый SQL никто не отменяет

лучшее из готового
Чистый SQL никто не отменяет


Слайд 10 NHibernate

NHibernate

Слайд 11 Кратко о библиотеке
Оригинальная Java версия – Hibernate
Версия 3.2.0
Сайт

Кратко о библиотекеОригинальная Java версия – HibernateВерсия 3.2.0Сайт http://nhforge.org

http://nhforge.org



Слайд 12 Как это работает
Краткая версия

Как это работаетКраткая версия

Слайд 13 Как это работает
Полная версия

Как это работает	Полная версия

Слайд 14 Сущности и их состояния
transient
persistent
detached

Сущности и их состоянияtransientpersistentdetached

Слайд 15 Сами сущности
POCO classes
Свойства вместо полей
Конструктор по умолчанию
Видимость не

Сами сущностиPOCO classesСвойства вместо полейКонструктор по умолчаниюВидимость не важнаEquals / GetHashCode

важна
Equals / GetHashCode


Слайд 16 Динамические модели
Можно обойтись без классов моделей
Dictionary
В мэппингах

Динамические моделиМожно обойтись без классов моделейDictionaryВ мэппингах – entity-name у классаВ

– entity-name у класса
В конфиге - default_entity_mode
В коде –

у сессии EntityMode.Map

Слайд 17 Callbacks

Callbacks

Слайд 18 Жизненный цикл
interface ILifecycle
void OnSave(ISession s, object id);
LifecycleVeto OnSave(ISession

Жизненный циклinterface ILifecyclevoid OnSave(ISession s, object id);LifecycleVeto OnSave(ISession s);LifecycleVeto OnUpdate(ISession s);LifecycleVeto OnDelete(ISession s);

s);
LifecycleVeto OnUpdate(ISession s);
LifecycleVeto OnDelete(ISession s);


Слайд 19 Валидация
IValidatable
void Validate();
ValidationFailure exception
Время вызова – не гарантируется

ВалидацияIValidatablevoid Validate();ValidationFailure exceptionВремя вызова – не гарантируется

Слайд 20 Mapping

Mapping

Слайд 21 Mapping through XML
Расширение .hbm.xml
Embedded resource
Регистрация через конфигурационный файл

Mapping through XMLРасширение .hbm.xmlEmbedded resourceРегистрация через конфигурационный файл

Слайд 22 Дополнительные объекты БД
В mapping файле
В классе реализующем NHibernate.Mapping.IAuxiliaryDatabaseObject
Можно

Дополнительные объекты БДВ mapping файлеВ классе реализующем NHibernate.Mapping.IAuxiliaryDatabaseObjectМожно параметризоватьМожно выполнять только для определенных диалектов БД

параметризовать
Можно выполнять только для определенных диалектов БД


Слайд 23

CREATE TRIGGER my_trigger ...

CREATE TRIGGER my_trigger ... DROP TRIGGER my_trigger

DROP TRIGGER my_trigger






parameterValue












Слайд 24 Mapping Fluent NHbibernate (3.1)
Пишется код для формирования mapping
Конфигурируется

Mapping Fluent NHbibernate (3.1)Пишется код для формирования mappingКонфигурируется тоже через кодПримеры

тоже через код
Примеры



Слайд 25 Традиционный mapping:


Традиционный mapping:      

assembly="QuickStart">




 











Слайд 26 Конфигурация через hibernate.cfg.xml




Конфигурация через hibernate.cfg.xml    NHibernate.Connection.DriverConnectionProvider    NHibernate.Driver.SqlClientDriver


NHibernate.Connection.DriverConnectionProvider


NHibernate.Driver.SqlClientDriver


Server=localhost;initial catalog=nhibernate;User Id=;Password=

false
NHibernate.Dialect.MsSql2000Dialect

resource="NHibernate.Auction.Item.hbm.xml" assembly="NHibernate.Auction" />
resource="NHibernate.Auction.Bid.hbm.xml" assembly="NHibernate.Auction" />




Слайд 27 Mapping через Fluent Nhibernate:

public class CatMap : ClassMap
{

public CatMap()
{
Id(x

=> x.Id);
Map(x => x.Name).Length(16).Not.Nullable();
Map(x => x.Sex);
References(x => x.Mate);
HasMany(x => x.Kittens);
}
}

Конфигурация:

Fluently.Configure().Database(SQLiteConfiguration
.Standard
.UsingFile("firstProject.db"))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf()) .BuildSessionFactory();

Слайд 28 Mapping via code NHbibernate (3.2)
Пишется код для формирования

Mapping via code NHbibernate (3.2)Пишется код для формирования mappingКонфигурируется тоже через кодПримеры

mapping
Конфигурируется тоже через код
Примеры



Слайд 29 ModelMapper mapper = new ModelMapper();
mapper.Class(m =>
{

m.Id(k => k.Id, g=>g.Generator(Generators.Native));
m.Table("People");
m.Property(k

=> k.Name);
m.Bag(k => k.Addresses,
t => { t.Table("PeopleAddresses"); t.Key(c=>c.Column("PersonId"));
t.Inverse(true); },
rel => rel.ManyToMany(many => many.Column("AddressId")) );
});

mapper.Class
(m =>
{
m.Id(k => k.Id, g => g.Generator(Generators.Native));
m.Table("Addresses");
m.Property(p => p.City);
m.Join("PeopleAddresses", z => { z.Property(p => p.IsDefault);
z.Property(p => p.ValidFrom); z.Property(p => p.ValidTo); z.Key(k => k.Column("PersonId")); });
});

Слайд 30 Associations

Associations

Слайд 31 One-to-One
Primary-key based

Foreign-key based


One-to-OnePrimary-key basedForeign-key based

Слайд 32 One-to-Many
  - ISet
- IList 
- IDictionary
-

One-to-Many  - ISet - IList  - IDictionary - IList и  - []В

IList
 и  - []
В коллекциях – сущности / простые типы


Слайд 33 Many-to-One

Many-to-One

Слайд 34 Many-to-Many



Many-to-Many

Слайд 35 Bi-directional associations
Два разных представления в памяти
Возможные проблемы решаются

Bi-directional associationsДва разных представления в памятиВозможные проблемы решаются с помощью inverse=“true”inverse cascade

с помощью inverse=“true”
inverse cascade


Слайд 36 Cascade
all
save-update
delete
all-delete-orphan

Cascadeallsave-updatedeleteall-delete-orphan

Слайд 37 Lazy initialization

Lazy initialization

Слайд 38 Механизм
Возвращается прокси а не сам объект
Данные загружаются только

МеханизмВозвращается прокси а не сам объектДанные загружаются только по необходимостиВозникают проблемы

по необходимости
Возникают проблемы если сессия закрыта
По умолчанию включен для

классов
Два подхода – класс наследник, либо реализация интерфейса класса

Слайд 39 Ограничения
Класс не sealed
Свойства и методы – virtual
Конструктор по

ОграниченияКласс не sealedСвойства и методы – virtualКонструктор по умолчанию не privateЕсли

умолчанию не private

Если proxy строится на базе интерфейса –

ограничения не действуют

Слайд 40 s = sessions.OpenSession();

User u = (User) s.Find("from User

s = sessions.OpenSession();User u = (User) s.Find(

u where u.Name=?", userName, NHibernateUtil.String)[0];

IDictionary permissions = u.Permissions;

s.Close();

...

int accessLevel

= (int) permissions["accounts"]; // Error!

Слайд 41 Lazy initialization и коллекции
Можно отключать
Аттрибут lazy у коллекций
Не

Lazy initialization и коллекцииМожно отключатьАттрибут lazy у коллекцийНе усердствовать с lazy=“false”

усердствовать с lazy=“false”


Слайд 42 LazyInitializationException
Не закрывать сессию (до завершения обработки запроса)
Вызвать руками

LazyInitializationExceptionНе закрывать сессию (до завершения обработки запроса)Вызвать руками NHibernateUtil.Initialize() передав туда

NHibernateUtil.Initialize() передав туда коллекцию
Привязать объект к сессии через Update

/ Lock

Слайд 43 Вариант получения общего кол-ва элементов в коллекции не

Вариант получения общего кол-ва элементов в коллекции не загружая ее из

загружая ее из базы:

ICollection countColl = s.Filter( collection,

"select count(*)" );

IEnumerator countEn = countColl.GetEnumerator();

countEn.MoveNext();

int count = (int) countEn.Current;

Слайд 44 Inheritance

Inheritance

Слайд 45 3 стратегии
Table per hierarchy
Table per subclass
Table per class
Если

3 стратегииTable per hierarchyTable per subclassTable per classЕсли в иерархии есть абстрактные классы – abstract=true

в иерархии есть абстрактные классы – abstract=true


Слайд 46

...   ...



column="PAYMENT_TYPE" type="String"/>

...

...


...


...



Слайд 47

...



name="Amount" column="AMOUNT"/>
...


...



...



...



Слайд 48

...



column="PAYMENT_TYPE" type="string"/>

...




...





...





...




Слайд 49

...



column="AMOUNT"/>
...


...


...


...



Слайд 50

...



name="Amount" column="CREDIT_AMOUNT"/>
...







...







...


Слайд 51 Operations

Operations

Слайд 52 Загрузка по Id
.Load(object, id)
.Load(id)
.Get(id)
Load – пробросит exception
Get –

Загрузка по Id.Load(object, id).Load(id).Get(id)Load – пробросит exceptionGet – вернет null

вернет null


Слайд 53 Save / Update / Delete
Save ~ INSERT
Update ~

Save / Update / DeleteSave ~ INSERTUpdate ~ UPDATEDelete ~ DELETESaveOrUpdate

UPDATE
Delete ~ DELETE
SaveOrUpdate ~ INSERT || UPDATE
Для persistent объектов

в рамках их контекста можно ничего дополнительно не вызывать

Слайд 54 Критерии
Session.CreateCriteria
ICriteria.Add( Restrictions. …)
Restrictions: Eq / Gt / Lt

КритерииSession.CreateCriteriaICriteria.Add( Restrictions. …)Restrictions: Eq / Gt / Lt / In …Но лучше – QueryOver APISession.QueryOver

/ In …
Но лучше – QueryOver API
Session.QueryOver




Слайд 55 C использованием критериев:

.Add(Restrictions.And(

Restrictions.Eq("Name", "test name"),

Restrictions.Or(
Restrictions.Gt("Age", 21),
Restrictions.Eq("HasCar", true))))


С использованием QueryOver

.Where(p => p.Name == "test name" && (p.Age > 21 || p.HasCar))

session.QueryOver()
.JoinQueryOver(c => c.Kittens)
.Where(k => k.Name == "Tiddles");

.Where(p => p.BirthDate.YearPart() == 1971)

.Select( p => Projections.Concat(p.LastName, ", ", p.FirstName), p => p.Height.Abs())


Слайд 56 Fetch Mode
User user = (User) session.CreateCriteria(typeof(User)) .SetFetchMode("Permissions", FetchMode.Join)

Fetch ModeUser user = (User) session.CreateCriteria(typeof(User)) .SetFetchMode(

.Add( Restrictions.Eq("Id", userId) ) .UniqueResult();


Слайд 57 Batch Size
На коллекциях и классах в mapping файлах

Batch SizeНа коллекциях и классах в mapping файлах

Слайд 58 Second Level Cache
Read only
Read / Write
Non-strict Read /

Second Level CacheRead onlyRead / WriteNon-strict Read / Write

Write


Слайд 59 Query Cache
.SetCacheable(true)
.SetCacheableRegion(“”)
Для сброса кэша
.SetForceCacheRefresh(bool)
ISessionFactory.EvictQueries()

Query Cache.SetCacheable(true).SetCacheableRegion(“”)Для сброса кэша.SetForceCacheRefresh(bool)ISessionFactory.EvictQueries()

Слайд 60 Multi Criteria & Queries
Можно выполнить несколько SQL запросов

Multi Criteria & QueriesМожно выполнить несколько SQL запросов за один заход

за один заход к серверу
Весьма полезно при реализации paging


Слайд 61 IMultiCriteria multiCrit = s.CreateMultiCriteria()
.Add(s.CreateCriteria(typeof(Item))

IMultiCriteria multiCrit = s.CreateMultiCriteria() .Add(s.CreateCriteria(typeof(Item))   .Add(Expression.Gt(

.Add(Expression.Gt("Id", 50))

.SetFirstResult(10))
.Add(s.CreateCriteria(typeof(Item))
.Add(Expression.Gt("Id", 50))
.SetProject(Projections.RowCount()));
IList results = multiCrit.List();
IList items = (IList)results[0];
long count = (long)((IList)results[1])[0];

Слайд 62 Работа с сессиями
Можно задать настройку hibernate.current_session_context_class
Теперь можно использовать

Работа с сессиямиМожно задать настройку hibernate.current_session_context_classТеперь можно использовать ISessionFactory.GetCurrentSession()

ISessionFactory.GetCurrentSession()


Слайд 63 Генерация схемы
Configuration cfg = ....;
new SchemaExport(cfg).Create(false, true);

Генерация схемыConfiguration cfg = ....;new SchemaExport(cfg).Create(false, true);

Слайд 64 Further Reading:

http://nhforge.org/doc/nh/en/index.html - документация

http://nhforge.org/blogs/nhibernate/default.aspx - блог



Further Reading:http://nhforge.org/doc/nh/en/index.html - документацияhttp://nhforge.org/blogs/nhibernate/default.aspx - блог

  • Имя файла: orm-nhibernate.pptx
  • Количество просмотров: 134
  • Количество скачиваний: 0