# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  Hibernating چیست

## mohsen_zelzela00

با سلام خدمت دوستان عزیز
میخواستم ببینم که  *Hibernating* چیست و کجا کاربرد دارد 

با تشکر

----------


## adinochestva

Hibernate یک راه حل orm برای java هست که نسخه .net اون nhibernate هست
orm ها وظیفه نقش میانی ارتباط object oriented برنامه با ساختار دیتابیس که relational یا همون رابطه ای هست رو به عهده می گیرند
مثلا شما در برنامه کلاسی به نام جنس داری و در دیتابیس جدولی به همین نام . orm میاد اینارو به هم متصل می کنه.

----------


## Ali_Mor

LINQ to sql هم در واقع یک orm است(مثل خیلی از موارد دیگه دات نت از جاوا الهام گرفته)

----------


## mohsen_zelzela00

در کدام نسخه از dotnet میتونیم از اون استفاده کنیم ؟ اگه مرجعی در این زمینه دارید و در اختیار بنده قرار بدهید ممنون میشم

----------


## adinochestva

check these :
http://stackoverflow.com/users/99343/adinochestva
http://stackoverflow.com/questions/1...-you-recommend

----------


## mohsen_zelzela00

آیا ما از LINQ استفاده کنیم بهتر است یا از Hibernating؟؟؟؟؟؟
 و مزیت های کدام یک بهتر است؟؟؟؟؟

----------


## Ali_Mor

در نسخه های قدیم دات نت (فکر کنم 2003و2005)یک پیاده سازی هائی از Hibernating بود که بهش میگفتن nHibernate
یادمه تو همین سایت هم یک مقاله در موردش نوشته بودن
به نظر من LINQ to sql توسعه همون پروژه است و صدالبته کاملتر و بهتر

----------


## adinochestva

> در نسخه های قدیم دات نت (فکر کنم 2003و2005)یک پیاده سازی هائی از Hibernating بود که بهش میگفتن nHibernate
> یادمه تو همین سایت هم یک مقاله در موردش نوشته بودن
> به نظر من LINQ to sql توسعه همون پروژه است و صدالبته کاملتر و بهتر


نظر جالبيست
خيلي ها از جمله خود من linq2sql رو orm  نمي دونيم فقط يك abstraction layer هست !
و nhibernate بسيار از اون قوي تر است و linq2sql به هيچ وجه نمونه كامل اون نيست

http://www.nhibernate.org/
http://en.wikipedia.org/wiki/Language_Integrated_Query
http://en.wikipedia.org/wiki/NHibernate

----------


## Alen

adinochestva عزیز و نیز دوست خوبم Ali_Mor میشه دلایل یا مراجعی رو برای صحبت هاتون معرفی کنید ؟
خیلی دوست دارم بدونم از کدومشون استفاده کنم بهتره ممنون

----------


## adinochestva

http://stackoverflow.com/questions/3...orite-net-orms

----------


## Ali_Mor

شاید من مفهوم ORM رو بد فهمیدم.(هر چند تعریف من هم تقریبا مثل تعریف شما در پست 2 می باشد). به اینجا در MSDN در رابطه با Linq to Sql توجه کنید
 In LINQ to SQL, the data model of a relational database is *mapped* to an object model expressed in the programming language of the developer 
و یا به اینجا
 LINQ to SQL *maps* a SQL Server database to a LINQ to SQL object model by either applying attributes or by using an external mapping file. …  
و یا در لینکی که خودتان آوردید:
since SQL Server stores the data as relational data and LINQ works with data encapsulated in objects, the two representations must be mapped to one another. For this reason, LINQ to SQL also defines the mapping framework. The mapping is done by defining classes that correspond to the tables in the database, and containing all or a subset of the
با این توصیفات نمی دانم چرا آن را یک ORM نمی دانید؟
اما اینکه nHibernate بهتر است یا Linq ؟ باید اذعان کنم اونقدری که با Linq آشنا هستم با دیگری آسنائی ندارم و نظر شما برام محترم خواهد بود.

----------


## adinochestva

خوب کار یک orm خیلی بیشتر از کاری هست که linq انجام می دهد
http://en.wikipedia.org/wiki/Object-relational_mapping
همانطور که گفتم linq میاد یک abstraction layer ایجاد میکنه. یعنی چی ؟ یعنی اینکه شما دیگر با sql کاری ندارید و دستوراتتون را با linq  می نویسید. ولی orm ها تمام این مسئولیت ها را به عهده می گیرند و شما برای کار با دیتابیس بهشون یک xml می دید که بگید فلان object به چه table در db ارتباط دارد و باقی کارها به عهده orm هست

----------


## Ali_Mor

در Linq to Sql برای mapping  ، بجای یک فایل  xml  از Attribute ها استفاده میشه(البته بصورت پیش فرض، وگرنه میشه یک فایل mapping جدا هم داشت)
اینکه ما کوئری ها  رو بجای نوشتن در رشته ها بصورت دستورات لینکیو بنویسیم منافی این نیست که Linq to Sql  یک ORM هم باشه.
مگر نه اینکه یک ORM یک نگاشت بین جداول بانک  با اشیا داخل برنامه بوجود میاره. خوب این کار رو Linq to Sql هم انجام میده. ماهم دیگه کاری نداریم که روابط داخل بانک چطور است و با اشیاء و براساس مدل شی گرا کار می کنیم.
مثلا فرض کنید در بانک جدولی برای نامه داریم و جدولی برای گیرندگان نامه که رابطه یک به چند دارند یعنی هر نامه می تواند چند گیرنده داشته باشد. در مدل شی گرا برای چنین مسئله ای یک کلاس نامه داریم که عضوی دارد بنام گیرندگان (بصورت آرایه با لیست). اگر از Linq to Sql استفاده کنیم (مانند ORM های دیگر) کافی است با داشتن یک شی نامه به گیرندگان آن دسترسی پیدا کنیم بدون اینکه خود را درگیر این مسئله کنیم که اطلاعات نامه در یک جدول بانک است و اطلاعات گیرندگان در جدول دیگر بانک.
ORM های دیگر چه کاری انجام میدهند که Linq to Sql از آن عاجز است؟
توجه کنید Linq گستره بزرگی دارد که یکی از شاخه های آن Linq to Sql است. بحث من هم بر سر همین شاخه است و گرنه شاخه های دیگر ربطی به ORM ندارند.

----------


## adinochestva

شما در Linq2sql به صورت مستقیم میشینی دستور می نویسی  فقط از نوشتن sql query شمارو بی نیاز می کنه ولی باید آن دستورات را با linq بنویسی و خودت توسط linq2sql یک dal بنویسی برای کارت
ولی orm ها کلا شمارو از نوشتن dal راحت می کنند
dal : data access layer

----------


## Alen

شاید بشه اینطور نتیجه گرفت که LINQ To SQL یک ORM هست و Hibernating چیزی فراتر از یک ORM
البته این فراتر بودن لزوماً به معنی بهینه بودن نیست 
این درکی هستش که من تا اینجا پیدا کردم

----------


## adinochestva

I tend to work the opposite way. I create the business objects the way I need them, and create NHibernate mappings from my objects to data. You can have NHibernate generate a schema for you based on your mappings, or you can create your own schema, and create the mappings to go between the two. Linq2Sql and Entity Framework do not support this. I can't speak to Subsonic on this point.
  I usually create my business classes, and get the application at least partially running without any database at all. This way I can develop a better understanding of what it is the application is supposed to do, and how it should behave before making the decision of how to persist the objects.
 



SubSonic and Linq2Sql are one-to-one orm mapper. Consider the situation where the datbase is normalized. For example an employee info is broken down in 3 different tables but in your domain model you'd want only one object Employee represent the info. This is where SubSonic and Linq2Sql fail. NHibernate allows you to map your domain object to multiple tables. Also you'd want to stay away from auto generated code. NHibernate allows you to define your own POCO (Plain old C#‎ object) domain and has different ways that allows us to map that to table(s) in database

http://stackoverflow.com/questions/3...based-projects

----------


## mn_zandy63

من با nHibernate کار نکردم اما مدت زیادیه که از Linq استفاده میکنم.
یک موضوع رو متوجه نشدم٬ وقتی شما میگی DAL رو برات مینویسه ولی Linq نه. یعنی دقیقاً چیکار میکنه؟
در لینک٬ چیزی رو که از دیتابیس میخوای رو به زبونی شبیه SQL مینویسی٬ حالا اگه از nHibernate استفاده کنی چه شکلی بهش میگی که چی رو از دیتابیس باید برات بیاره؟ همه توابع ممکن رو برات پیاده سازی میکنه؟ یه string مثلا شامل یک select بهش میدی؟ چیکار میکنی؟

----------


## Alen

با nHibernate  ميگي كه شرايط چي هست اون خودش سطرهايي از جدول رو كه با شرايط ما تطبيق دارند رو در قالب شي به يا ليستي از اشيا به ما برمي گردونه
البته شايد تفاوت در اعمالي مثل درج يا به روز رساني محرز تر باشه

----------


## Alen

حالا يه سوال از اساتيد محترم
استفاده از nHibernate تا چه حد خوبه؟
آبا كليه اعمال مربوط به DB رو به اون بسپاريم؟
قابليت كار با ابزارهاي گزارشگيري مثل crystal reprt رو داره؟

----------


## mn_zandy63

> با nHibernate  ميگي كه شرايط چي هست اون خودش سطرهايي از جدول رو كه با شرايط ما تطبيق دارند رو در قالب شي به يا ليستس از اشيا به ما برمي گردونه
> البته شايد تفاوت در اعمالي مثل درج يا به روز رساني محرز تر باشه


میشه یه مثال ساده بزنی  :متفکر: 
منظورت از اینکه "میگی شرایط چی هست خودش میاره" چیه؟
چیزی که من از این جمله برداشت کردم که همون SELECT معمولی با یک SQLCommand هم همینه که.
اما اگه منظورت ادامه جمله است: "در قالب لیستی از اشیا".
خب LINQ هم که همین کار رو انجام میده.
اما اینجا بحث شد که LINQ یک ORM نیست.  :متفکر:  پس ORM چیکار میکنه؟

----------


## Alen

در كل nHibernate به سه طريق مي تونه اطلاعات رو بازيابي كنه 
1-بوسيله متد get يا load وبوسيله شناسه شي :

User user = session.Get<User>(userID);

2-بوسيله HQL (زبان پرس و جوي Hibernate) : كه شبيه دستورات SQL هستش :

IQuery q = session.CreateQuery("from User u where u.Firstname = :fname");
q.SetString("fname", "Max");
IList<User> result = q.List<User>();


3-بوسيله متد criteria:

ICriteria criteria = session.CreateCriteria(typeof(User));
criteria.Add( Expression.Like("Firstname", "Max") );
IList result = criteria.List();

كه آخري قابليت اين رو داره كه يه شي نمونه بگيره و به عنوان الگوي جستجو ازش استفاده كنه
اما همونطور كه شما هم گفتيد اين روشها شبيه به همون چيزهايي هستش كه در linq هم ميبينيم
شايد قدرت اصلي nHibernate در ذخيره سازي و به روز رساني باشه ، جايي كه ميتونه حتي رو ساختار درختي از اشيامانور  بده و روابط بين اشيا رو كاملا در نظر بگيره، يه فرض مثال وقتي شما يه شي رو ذخيره ميكنيد و يا حتي اون رو به روز رساني ميكنيد اشيايي كه زير مجموعه اون شي محسوب ميشن و به نوعي وابستگي به اون شي دارند بدون نياز به نوشتن دستورات جداگانه اي ذخيره ميشند
به زبان ساده تر اگه يه گراف از اشيا داشته باشيد ، عمل ذخيره بر روي تمامي گراف صورت خواهد پذيرفت.
البته به نظر ميرسه linq به زودي قابليتهاي حديد زيادي رو ارائه بده كه nHibernate رو تا حد زيادي از ميدان به در كنه . بايد منتظر آينده موند

----------


## mn_zandy63

> در كل nHibernate به سه طريق مي تونه اطلاعات رو بازيابي كنه 
> 1-بوسيله متد get يا load وبوسيله شناسه شي :
> 
> User user = session.Get<User>(userID);
> 
> 2-بوسيله HQL (زبان پرس و جوي Hibernate) : كه شبيه دستورات SQL هستش :
> 
> IQuery q = session.CreateQuery("from User u where u.Firstname = :fname");
> q.SetString("fname", "Max");
> ...


سلام دوست من، ممنون از پاسخت
جالبه، البته مورد آخر رو، اگه درست متوجه منظورت شده باشم، LINQ همین الان انجام میده

موفق باشی.

----------


## مهدی عابدینی

https://barnamenevis.org/showthread.php?t=229095

----------


## مهدی عابدینی

ان هایبرنت از ابتدا تا انتها
https://barnamenevis.org/showthread.php?t=229095

----------

