PDA

View Full Version : Hibernating چیست



mohsen_zelzela00
چهارشنبه 30 اردیبهشت 1388, 22:33 عصر
با سلام خدمت دوستان عزیز
میخواستم ببینم که Hibernating چیست و کجا کاربرد دارد

با تشکر

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

Ali_Mor
پنج شنبه 31 اردیبهشت 1388, 10:11 صبح
LINQ to sql هم در واقع یک orm است(مثل خیلی از موارد دیگه دات نت از جاوا الهام گرفته)

mohsen_zelzela00
پنج شنبه 31 اردیبهشت 1388, 19:42 عصر
در کدام نسخه از dotnet میتونیم از اون استفاده کنیم ؟ اگه مرجعی در این زمینه دارید و در اختیار بنده قرار بدهید ممنون میشم

adinochestva
پنج شنبه 31 اردیبهشت 1388, 19:54 عصر
check these :
http://stackoverflow.com/users/99343/adinochestva
http://stackoverflow.com/questions/132676/which-orm-for-net-would-you-recommend

mohsen_zelzela00
چهارشنبه 06 خرداد 1388, 11:01 صبح
آیا ما از LINQ استفاده کنیم بهتر است یا از Hibernating؟؟؟؟؟؟
و مزیت های کدام یک بهتر است؟؟؟؟؟

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

adinochestva
چهارشنبه 06 خرداد 1388, 15:59 عصر
در نسخه های قدیم دات نت (فکر کنم 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
چهارشنبه 06 خرداد 1388, 20:55 عصر
adinochestva عزیز و نیز دوست خوبم Ali_Mor میشه دلایل یا مراجعی رو برای صحبت هاتون معرفی کنید ؟
خیلی دوست دارم بدونم از کدومشون استفاده کنم بهتره ممنون

adinochestva
چهارشنبه 06 خرداد 1388, 22:42 عصر
http://stackoverflow.com/questions/3505/what-are-you-favorite-net-orms

Ali_Mor
پنج شنبه 07 خرداد 1388, 01:32 صبح
شاید من مفهوم ORM رو بد فهمیدم.(هر چند تعریف من هم تقریبا مثل تعریف شما در پست 2 می باشد). به اینجا (http://msdn.microsoft.com/en-us/library/bb386989.aspx)در 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

و یا به اینجا (http://msdn.microsoft.com/en-us/library/bb386971.aspx)

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. …

و یا در لینکی (http://en.wikipedia.org/wiki/Language_Integrated_Query)که خودتان آوردید:
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
پنج شنبه 07 خرداد 1388, 11:17 صبح
خوب کار یک orm خیلی بیشتر از کاری هست که linq انجام می دهد
http://en.wikipedia.org/wiki/Object-relational_mapping
همانطور که گفتم linq میاد یک abstraction layer ایجاد میکنه. یعنی چی ؟ یعنی اینکه شما دیگر با sql کاری ندارید و دستوراتتون را با linq می نویسید. ولی orm ها تمام این مسئولیت ها را به عهده می گیرند و شما برای کار با دیتابیس بهشون یک xml می دید که بگید فلان object به چه table در db ارتباط دارد و باقی کارها به عهده orm هست

Ali_Mor
پنج شنبه 07 خرداد 1388, 14:37 عصر
در 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
پنج شنبه 07 خرداد 1388, 16:06 عصر
شما در Linq2sql به صورت مستقیم میشینی دستور می نویسی فقط از نوشتن sql query شمارو بی نیاز می کنه ولی باید آن دستورات را با linq بنویسی و خودت توسط linq2sql یک dal بنویسی برای کارت
ولی orm ها کلا شمارو از نوشتن dal راحت می کنند
dal : data access layer

Alen
پنج شنبه 07 خرداد 1388, 16:54 عصر
شاید بشه اینطور نتیجه گرفت که LINQ To SQL یک ORM هست و Hibernating چیزی فراتر از یک ORM
البته این فراتر بودن لزوماً به معنی بهینه بودن نیست
این درکی هستش که من تا اینجا پیدا کردم

adinochestva
پنج شنبه 07 خرداد 1388, 17:19 عصر
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/331951/class-usage-in-orm-based-projects

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

Alen
دوشنبه 27 مهر 1388, 23:00 عصر
با nHibernate ميگي كه شرايط چي هست اون خودش سطرهايي از جدول رو كه با شرايط ما تطبيق دارند رو در قالب شي به يا ليستي از اشيا به ما برمي گردونه
البته شايد تفاوت در اعمالي مثل درج يا به روز رساني محرز تر باشه

Alen
دوشنبه 27 مهر 1388, 23:05 عصر
حالا يه سوال از اساتيد محترم
استفاده از nHibernate تا چه حد خوبه؟
آبا كليه اعمال مربوط به DB رو به اون بسپاريم؟
قابليت كار با ابزارهاي گزارشگيري مثل crystal reprt رو داره؟

mn_zandy63
چهارشنبه 29 مهر 1388, 00:27 صبح
با nHibernate ميگي كه شرايط چي هست اون خودش سطرهايي از جدول رو كه با شرايط ما تطبيق دارند رو در قالب شي به يا ليستس از اشيا به ما برمي گردونه
البته شايد تفاوت در اعمالي مثل درج يا به روز رساني محرز تر باشه

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

Alen
چهارشنبه 29 مهر 1388, 16:40 عصر
در كل 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
شنبه 09 آبان 1388, 14:06 عصر
در كل 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 رو تا حد زيادي از ميدان به در كنه . بايد منتظر آينده موند

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

موفق باشی.

مهدی عابدینی
دوشنبه 14 تیر 1389, 15:51 عصر
http://barnamenevis.org/forum/showthread.php?t=229095

مهدی عابدینی
دوشنبه 14 تیر 1389, 15:52 عصر
ان هایبرنت از ابتدا تا انتها
http://barnamenevis.org/forum/showthread.php?t=229095