آموزش Hibernate جاوا
هایبرنیت ورژن 3.0 آخرین ورژن متن باز تکنولوژی پایدار در قلب EJB 3.0 می باشد که از آدرس www.Hibernate.com در دسترس برای دانلود می باشد. هسته هایبرنیت شامل 68549 خط کد جاوا به همراه 27948 خط کد واحدهای تست آن می باشد که تحت LGPL به صورت آزاد می باشد و توسعه آن بیش از یک سال طول کشیده شده است. هایبرنیت کلاس های جاوا را به جداول پایگاه داده نگاشت می کند. همچنین امکانات بازیابی اطلاعات و ایجاد پرس و جو برروی آن ها را فراهم می کند و به طور موثری زمان توسعه نرم افزار را کاهش می دهد. هایبرنیت بهترین راه حل برای برنامه های مرکز داده ای که فقط از روال های ذخیره شده برای پیاده سازی منطق تجاری نرم افزار استفاده می کنند نیست. هایبرنیت بیشتر برای کاربردهایی که دامنه آن ها در مد شی گرایی می باشد و برای پیاده سازی منطق تجاری در لایه میانی که بر پایه جاوا می باشد مفید است.هایبرنیت به برنامه اجازه می دهد که بین هر پایگاه داده ای سوئیچ کند. هایبرنیت می تواند در برنامه های Swing جاوا و همچنین برنامه های مبتنی بر Servlet و یا در برنامه های J2EE به کار گرفته شود.
آموزش نگاشت Mapping در Hibernate
به وسیله این استراتژی، می توانید کل سلسله مراتب (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 استفاده می کنیم که در آن هر سوال می تواند دارای چندین جواب باشد.
در Hibernate ، می توانید سلسله مراتب کلاس های برنامه را در یک جدول پایگاه داده نگاشت یا آدرس دهی ( map ) کنید . سه نوع استراتژی برای این منظور در Hibernate وجود دارد : جدول برمبنای سلسله مراتب ( Table Per Hierarchy ) جدول برمبنای کلاس های واقعی ( Table Per Concerete Class ) جدول برمبنای کلاس های زیرمجموعه ( Table Per Subclass )
اگر کلاس 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 به جدول اصلی برنامه اضافه نمی شود.