آموزش Hibernate جاوا

هایبرنیت ورژن 3.0 آخرین ورژن متن باز تکنولوژی پایدار در قلب EJB 3.0 می باشد که از آدرس www.Hibernate.com در دسترس برای دانلود می باشد. هسته هایبرنیت شامل 68549 خط کد جاوا به همراه 27948 خط کد واحدهای تست آن می باشد که تحت LGPL به صورت آزاد می باشد و توسعه آن بیش از یک سال طول کشیده شده است. هایبرنیت کلاس های جاوا را به جداول پایگاه داده نگاشت می کند. همچنین امکانات بازیابی اطلاعات و ایجاد پرس و جو برروی آن ها را فراهم می کند و به طور موثری زمان توسعه نرم افزار را کاهش می دهد. هایبرنیت بهترین راه حل برای برنامه های مرکز داده ای که فقط از روال های ذخیره شده برای پیاده سازی منطق تجاری نرم افزار استفاده می کنند نیست. هایبرنیت بیشتر برای کاربردهایی که دامنه آن ها در مد شی گرایی می باشد و برای پیاده سازی منطق تجاری در لایه میانی که بر پایه جاوا می باشد مفید است.هایبرنیت به برنامه اجازه می دهد که بین هر پایگاه داده ای سوئیچ کند. هایبرنیت می تواند در برنامه های Swing جاوا و همچنین برنامه های مبتنی بر Servlet و یا در برنامه های J2EE به کار گرفته شود.
مقدمه آموزش Hibernate

در بخش آموزش Hibernate ، قصد داریم تا با ارائه مثال های ساده و عملی ، مفاهیم اصلی و کلیدی این تکنولوژی را به صورت کامل بررسی کنیم .

معماری Hibernate شامل اشیایی زیادی است که از آن جمله میتوان به presistent object ، session factory ، transaction factory، connection factory، session ، transaction و ... اشاره کرد .

آموزش ایجاد اولین برنامه Hibernate بدون استفاده از محیط IDE در این درس ، قصد داریم تا نحوه طراحی یک برنامه Hibernate بدون استفاده از محیط IDE را آموزش دهیم .

آموزش ایجاد برنامه hibernate در محیط Eclips IDE

آموزش ایجاد برنامه Hibernate در MyEclipse

برنامه های Hibernate را می توان به همراه annotation ها نیز ایجاد کرد . همانطور که می دانید ، annotation یا به معنی فارسی " توضیحات متنی درباره داده " ، اطلاعاتی است که در لا به لای کدهای برنامه قرار داده می شوند . این کدها توضیحاتی را به نحوه عملکرد برنامه و روند اجرای آن ارایه می کنند که هم برای کاربر و هم برای کامپایلر جاوا قابل فهم است ، ولی انرژی برروی کدهای برنامه ندارد و در خروجی هم نمایش داده نمی شود . Annotation هایی زیادی از جمله @Entity ، @Icl ، @Table و ... وجود دارد که از آنها می توانید در برنامه های Hibernate استفاده کنید . Annotation ها در Hibernate برپایه JPA 2 تعریف شده اند و قابلیت های آن را دارا می باشند . کلید JPA Annotation ها در پکیج javax.persistence.* تعریف شده اند . Entity Manger در Hibernate ، رابط کاربری و Life cycle تعیین شده توسط JPA را اجرا و تولید می کند . مهمترین فایده استفاده از annotation در Hibernate ، این است که دیگر نیازی ندارد تا فایل mapping ( hbm ) را برای برنامه ایجاد کنید . در اینجا Hibernate annotation برای تولید meta data به کار می رود .

در این درس قصد داریم تا نحوه طراحی یک برنامه تحت وب Web Applicationبه استفاده ازHibernate را آموزش دهیم . جهت ایجاد برنامه تحت وب از JSP به طراحی لایه peresentation logic ، از کلاس Bean برای نگهداری کردن داده ها و از کلاس های DAO جهت تعیین کد های پایگاه داده استفاده خواهیم کرد . همانطور که در درس های قبل ، یک برنامه ساده Hibernate نیز ، نیاز به انجام کارهای زیادی نیست . در همچنین برنامه ای ، ما داده ها و اطلاعات را به وسیله یک فایل JPS از کاربرد دریافت می کنیم .

زیر عنصر <generator> المنت id ، جهت تولید شناسه های منحصر به فرد ( unique identifier ) برای اشیای کلاس Persistent به کار میرود . کلاس های سازنده ( generat class ) زیادی درچهارچوب کاری Hibernate تعیین شده اند که از آنها می توانید برای تولید سریع کد برنامه استفاده کنید .

برای اتصال هر برنامه hibernate به پایگاه داده ، شما بایستی SQL Dialect متناسب را برای آن تعیین کنید . اما SQL Dialect چیست. در معنی لغوی (( گویش یا لحجه SQL )) ترجمه میشود . سیتم های داده ای مختلف از برخی دستورات یا Sytax های مخصوص به خود در SQL استفاده می کنند . بنابراین شما در برنامه خود بایستی تعیین کنید که می خواهید به چه دیتابیسی وصل شوید ، تا برنامه بهتر بتواند زبان دستورات را بفهمند .
آموزش logging در Hibernate
آموزش نگاشت Mapping در Hibernate

در Hibernate ، می توانید سلسله مراتب کلاس های برنامه را در یک جدول پایگاه داده نگاشت یا آدرس دهی ( map ) کنید . سه نوع استراتژی برای این منظور در Hibernate وجود دارد : جدول برمبنای سلسله مراتب ( Table Per Hierarchy ) جدول برمبنای کلاس های واقعی ( Table Per Concerete Class ) جدول برمبنای کلاس های زیرمجموعه ( Table Per Subclass )

به وسیله این استراتژی، می توانید کل سلسله مراتب (Hierachy) برنامه را در یک جدول تنها، نگاشت یا آدرس دهی (map) کنید. در این مدل، یک ستون اضافه در جدول وجود دارد که به آن ستون تفکیک کننده یا discriminator column می گویند و برای تشخیص و تمایز کلاس ها از یکدیگر به کار می رود.

در درس قبلی، ما به وسیله یک جدول تنها در یک فایل xml، سلسله مراتب وراثت (inheritance hierarchy) را آدرس دهی و نگاشت (mapping) کردیم. در این درس، قصد داریم همین کار را مجددا به وسیله annotation انجام دهیم.

Cدر مدل نگاشت Table Per Concrete Class ، به ازای هر کلاس برنامه یک جدول در پایگاه داده ایجاد می شود که این جدول ها، هیچ نوع ارتباطی با هم ندارند. دو راه برای اتصال و ایجاد ارتباط بین جدول (Table) و مدل نگاشت Table Per Concrete Class وجود دارد که عبارتند از : استفاده از المنت Unio-Subclass. به وسیله ایجاد خود به خودی جدول برای هر کلاس.

همان طور که در درس قبل اشاره کردیم، در مدل نگاشت Table Per Concrete Class به ازای هر کلاس، یک جدول در پایگاه داده ایجاد می شود. بنابراین مقادیر خالی (Nnallblc) در جدول ها نخواهیم داشت. تنها عیب استفاده از این روش، ایجاد ستون های تکراری در جدول های کلاس های زیرمجموعه است. در این مدل ما بایستی از Annotation های @Inheritance در کلاس اصلی و از @AltributeOVerrides در کلاس های زیرمجموعه استفاده کنیم. @Inheritance مشخص می کند که ما داریم از مدل نگاشت Table Per Concrete Class در برنامه خود استفاده می کنیم. این Annotation فقط بایستی در کلاس Pareut تعیین شود. از طرف دیگر، @AltributeOVerrides تعیین می کند که خواص کلاس Pareut در کلاس های زیرمجموعه، بازنویسی خواهند شد. در ساختار جدول ها، ستون های جدول کلاس Pareut در جدول کلاس زیرمجموعه، اضافه خواهند شد.

در مدل نگاشت Table Per Subclass، جدول های آدرس دهی شده کلاس های زیرمجموعه از طریق کلیدهای اصلی (Primary key) و یا کلید خارجی (foreign key) به جدول کلاس اصلی Parent برنامه مرتبط هستند. از المنت <joined-subclass> برای اتصال و آدرس دهی کلاس فرزند (child class) به کلاس مادر (Parent class) توسط Primary key یا foreign key استفاده می شود. در مثال این درس، قصد داریم تا از خاصیت hb2dll.auto برای تولید خودکار جداول استفاده کنیم. بنابراین نیازی نیست نگران ایجاد جدول ها در پایگاه داده باشیم.

همان طور که در درس های قبل، اشاره کردیم در استراتژی نگاشت Table Per Subclass، جدول های پایگاه داده به ازای هر کلاس اصلی (Persistent Class) ایجاد شده و از طریق کلیدهای اصلی (Primary key) و کلیدهای خارجی (Foreign key) به هم متصل هستند. بنابراین در این نوع رابطه، ستون های تکراری نخواهیم داشت.

آموزش آدرس دهی مجموعه ها (Collection) در Hibernate شما می توانید عناصر مجموعه ای (Collection Elements) موجود در کلاس اصلی Persistent Class را در Hibernate آدرس دهی (mapping) کنید ...

اگر کلاس خام و اصلی برنامه (Persistant Class)، حاوی شی List object باشد، به سادگی می توانید شی List را به وسیله المنت <list> کلاس در فایل mapping و یا annotation آدرس دهی کنید. در این درس، ما از سناریوی 1 یا Forum استفاده می کنیم که در آن هر سوال می تواند دارای چندین جواب باشد.

اگر کلاس Persistant Class شما دارای اشیای لیست آدرس دهی (object list) باشد که حاوی رفرنس های entity هستند، بایستی از روش one-to-many برای آدرس دهی (map) المنت های لیست دار استفاده کنیم. در این مثال، ما از سناریو انجمن استفاده می کنیم که هر سوال می تواند چندین جواب داشته باشد. دیاگرام این سناریو در مثال زیر نشان داده شده است : در مواردی همانند مثال فوق، برای هر سوال ممکن است چندین جواب وجود داشته باشد و هر جواب هم اطلاعات مختص به خود را دارد. برای همین دلیل ما از List جهت کلاس persistant Class استفاده کردیم.

اگر کلاس Persistent Class شما شامل اشیای لیست دار List object است، می توانید List را به وسیله المنت list یا bag در فایل آدرس دهی mapping file آدرس دهی یا map کنید. المنت bag کاملا مشابه المنت List می باشد با این تفاوت که نیاز به المنت index ندارد.

اگر کلاس Persistent Class شما شامل اشیای لیست دار list object ای باشد که خود حاوی رفرنس های entity است، بایستی از روش آدرس دهی One to Many mapping برای آدرس دهی یا map کردن المنت های list استفاده کنیم. ما می توانیم این شی لیست (list object) را با استفاده از المنت list یا bag آدرس دهی کنیم.

اگر کلاس Persistent Class شما شامل متغیرهای Set objects می باشد، می توانید از المنت Set در فایل آدرس دهی mapping file برای map متغیر Set استفاده کنید. المنت Set نیازی به index گذاری ندارد. متغیرهای Set و List کاملا شبیه هم هستند، با این تفاوت که متغیرهای Set فقط مقادیر یکتا و غیر تکراری (Unique) را در اعضای خود نگهداری می کند.

اگر کلاس Persistent Class شما دارای اشیای Set ای است که محتوی رفرنس های entity می باشند، بایستی از روش one-to-many برای آدرس دهی یا map المنت Set استفاده کنیم. شما همچنین می توانید این list object را با المنت Set آدرس دهی کنید. ابتدا بیایید نگاهی به کد کلاس Persistent Class که دارای اشیای set objects می باشند، بیاندازیم. در این کلاس، هر question می تواند دارای چندین answer باشد که هر answer نیز دارای اطلاعات مختص به خود می باشد. برای همین است که ما از المنت Set برای جایگزینی مجموعه ای از جواب ها (answers) استفاده کرده ایم .

Hibernate به شما امکان آدرس دهی المنت Map را به وسیله RD MS می دهد. همان طور که می دانید المنت های map و list، ایندکس گذاری شده یا index-basesd هستند. در این موارد، ستون index به عنوان کلید key و ستون element به عنوان مقدار یا Value عمل می کند.

شما می توانید ارتباط many to many را با استفاده از المنت های set، bag، map و غیره انجام دهید. در این درس قصد داریم تا از المنت map برای آدرس دهی many to many استفاده کنیم. در این حالت، 3 جدول ایجاد خواهد شد که به بررسی آن ها خواهیم پرداخت.

روابط دو طرفه یا Bidirectional Assocation به شما امکان خواندن و دریافت fetch اطلاعات اشیای وابسته یا object dependent را از دو طرف می دهد. در چنین مواردی، رفرنس هایی مربوط به هر یک از کلاس ها در کلاس دیگر وجود دارد. برای روشن شدن مسئله به بررسی ارتباط Employee و Address می پردازیم. در این حالت بایستی کلاس Employee Class یک رفرنس به کلاس Address و کلاس Address یک رفرنس به کلاس Employee داشته باشد.

استراتژی Lazy Collection (خواندن حداقل اطلاعات لازم جهت بالا بردن کارایی سیستم) فقط بر حسب نیاز اشیای فرزند (Child objects) برنامه را لود می کند. این کار برای بالا بردن کارایی یا Perfomance سیستم استفاده می شود. از Hibernate 30 به بعد، قابلیت Lazy Collection به صورت پیش فرض فعال است. برای استفاده از امکان Lazy Collection در برنامه های Hibernate، بایستی مقدار خاصیت lazy=”true” را در Collection خود قرار دهید. همان طور که اشاره شد، این امکان به صورت پیش فرض در Hibernate 30 به بعد فعال است و اصولا نیاز به انجام کار فوق نیست. اما اگر مقدار خاصیت lazy را بر روی false قرار دهید، آنگاه برنامه کلید اشیای فرزند Child objects را در هنگام اجرا لود می کند که باعث کاهش شدید کارایی یا Perfomance سیستم مخصوصا در حجم زیاد داده ها می شود.

در استراتژی Component Mapping ما هر شی وابسته یا dependent object را به عنوان یک Component آدرس دهی می کنیم. یک Component یک شی یا object است که به صورت مقدار یا Value نگهداری می شود تا refrence. این روش معمولا زمانی استفاده می شود که dependent object دارای کلید اصلی Primary key نیست. همچنین Component Mapping برای انجام عمل ترکیب یا Composition که دارای ارتباط (HAS-(A relation به کار رفته و به همین دلیل Component نامگذاری شده است.

شما می توانید روش آدرس دهی one to one mapping را از دو راه انجام دهید : به وسیله المنت many-to-one. به وسیله المنت many-to-one. در این درس، قصد داریم روش اجرای آدرس دهی one to one mapping را به وسیله المنت many –to-one آموزش دهیم. در چنین موردی، یک کلید خارجی foreign key در جدول اصلی برنامه ایجاد می شود.

همانطور که در درس قبل مطرح کردیم، دو راه برای آدرس دهی one to one mapping در Hibernate وجود دارد که عبارتند از : استفاده از المنت many-to-one. استفاده از المنت one-to-one. در این درس قصد داریم روش اجرای آدرس دهی one to one mapping را با استفاده از المنت one-to-one آموزش دهیم. در چنین موردی، هیچ کلید خارجی foreign key به جدول اصلی برنامه اضافه نمی شود.
آموزش مدیریت تراکنش و پایگاه داده Hibernate

یک تراکنش (transaction) به طور ساده عبارت است از یک واحد مستقل کار. در چنین موردی، وقتی یک مرحله از تراکنش ناموفق اجرا شود، بایستی کل تراکنش لغو گردد، وگرنه نتیجه ناقص در بر خواهد داشت (به این اصل در اصطلاح atomicity یا یکپارچگی می گویند). یک تراکنش را می توان به وسیله چهار خاصیت یا Properties مهم که در اختصار به آن ها ACFO می گویند، توصیف کرد.

زبان کار با پایگاه داده در Hibernate یا Hibernate Query Language که ساختار HQL نامیده می شود، کاملا شبیه زبان SQL بوده با این تفاوت که زبان HQL مبتنی بر جدول پایگاه داده نیست. به جای استفاده از نام جدول در HQL ما از نام کلاس استفاده می کنیم. بنابراین HQL یک زبان مستقل از پایگاه داده می باشد.

زبان HCQL که مخفف عبارت Hibernate Criteria Query Language است، برای استخراج و دریافت رکوردها از یک رابطه یا جدول بر مبنای یک عبارت جستجو یا الگو خاص (Criteria) به کار می رود. رابط کاربری Criteria یا Criteria Interface متدهایی را فراهم می کند تا به وسیله آن ها معیار مورد نظر جستجو را به Query خود اعمال کنیم. برای مثال اطلاعات رکوردهایی را که میزان حقوق (فیلد Salary آن ها بیسشتر از 50000 است را بیابد و ...).

Hibernate Named Quer راهی است برای استفاده از Query در سطح برنامه با استفاده از نام های معنی دار. به عبارت دیگر یک نام هم معنی با کارکرد Query برای آن انتخاب کرده و به وسیله آن نام Query مورد نطر را در برنامه های Hibernate فراخوانی و اجرا می کنیم. Hibernate Named Quer همانند کاربرد alias در زبان SQL است. چهارچوب کاری Hibernate امکان استفاده از Named Query ها را فراهم کرده و به همین دلیل دیگر برنامه نویسان جاوا نیاز ندارند تا Query را در کل سطح برنامه پراکنده کنند. دو روش برای تعیین Named Query در Hibernate وجود دارد : استفاده از annotation.استفاده از فایل mapping file.


کش Second Level Cache Hibernate از یک کش اشتراکی Common Cache برای تمامی Session object های شی Session factory استفاده می کند. این کش در صورتی که چندین شی Session object از یک Session factory داشته باشید، بسیار کارآمد است. شی Session Factory اطلاعات second level را نگهداری می کند. این شی برای کلیه session object ها عمومی بوده و به صورت پیش فرض فعال نیست.

شما می توانید هر برنامه struts2 را با برنامه های Hibernate به راحتی ادغام کنید. برای انجام این کار تلاش اضافه ای لازم نیست. در این مثال آموزشی قصد داریم تا چهارچوب کاری Struts2 را با Hibernate به کار ببریم. برای این منظور نیاز دارید فایل های jar لازم جهت Struts2 و Hibernate را داشته باشید.

شما به سادگی می توانید برنامه های Spring و Hibernate را با هم ادغام کنید. در چهارچوب کاری Hibernate کلیه اطلاعات لازم جهت پایگاه داده را در فایل Hibernate.cfg.xml تعیین می کنیم. اما اگر بخواهیم یک برنامه Hibernate را با یک برنامه Spring ادغام کنیم، دیگر نیازی به ایجاد فایل hibernate.cfg.xml نیست. می توانیم کلیه اطلاعات مورد نیاز را در فایل applicationContext.xml قرار بدهیم.