استفاده از Hibernate API
از سری مقالات آموزش Java Enterprise, مبحث Hibernate API را بر میگزینیم و با استفاده از آن میخواهیم یک Object را در پایگاه داده ذخیره سازی کنیم و شیوه کار Hibernate API را مورد بررسی قرار دهیم.
در مقاله قبل به مفاهیم اولیه Hibernate پرداخته شد. فایل hiberanate.cfg.xml را متناسب با پایگاه داده مورد نظر تنظیم کردیم و یک کلاس برای نگهداری اطلاعات ایجاد کردیم. اکنون باید شیوه کار hibernate و انجام تراکنش با پایگاه داده بررسی شود .هرگاه نیاز به انجام تراکنشی داشته باشیم, نیاز است تا از یک Session استفاده کنیم و Session مورد نیاز را از Session Factory دریافت میکنیم. در نتیجه, اولین گام ایجاد یک Session Factory است. Session Factory مدیریت Session ها را بر عهده دارد. در مدتی که برنامه درحال اجرا است, تمام Session های Hibernate, از طریق این کلاس مدیریت میشوند. Session Factory, تنها یک بار در طول مدت اجرا برنامه ایجاد میشود.
گام بعدی ایجاد Session با استفاده از Session Factory است. برای هر تراکنش با پایگاه داده ها, یک Session ایجاد میکنیم. در نهایت از Session ها برای ذخیره سازی Object ها استفاده میشود. در واقع میتوان Session ها را یک اتصال به پایگاه داده ها دانست. Session ها Object های سبکی هستند که در هر تراکنش ایجاد میشوند. به بیان دیگر, Session ها نباید در طولانی مدت فعال باشند. وظیفه اصلی Session ها انجام عمل Mapping است و در یکی از سه حالت زیر قرار دارد:
- Transient : حالتی است که یک Instance از کلاس مورد نظر ایجاد میشود و هنوز به هیچ Session الحاق نشده است
- Persistent : حالتی است که Instance ایجاد شده (حالت Transient) را به Session متصل میکند
- Detached : حالتی است که Instance از Session جدا میشود. در واقع به محض از بین رفتن Object کلاس, Session آزاد میشود.
اگر کلاس یک Session خاصیت Serialize بودن را داشته باشد, Session نیز Serializable است. منظور از Serializable بودن یک Object این است که وضعیت فعلی یک Object را به Byte Stream تبدیل کنیم و در نهایت با استفاده از Byte Stream موجود به وضعیت Object پیش از تبدیل برسیم. با استفاده از Serialize میتوان یک Object را در یک بستر به صورت بایتی انتقال داد. برای مثال String ها, Serializable هستند. لیست متد های کلاس Session در Hibernate را میتوانید از اینجا مشاهده کنید.
کلاس هایی از جاوا که قرار است یک Instance از آنها در پایگاه داده ذخیره شود را Persistent Class گویند. برای اینکه تراکنش ها توسط Hibernate دقیق تر انجام شوند, نیاز است تا Persistent class ها در قالب یکسری از قواعد ایجاد شوند:
- تمام کلاس ها نیاز است تا یک Id به عنوان Primary Key داشته باشند. این متغیر باید با ID Annotation در کلاس مشخص شود.
- تمام کلاس ها باید از نوع Java Beans باشند.
اکنون میخواهیم برنامه ای که در مقاله قبل ایجاد کرده ایم, را ادامه دهیم و یک Object از کلاس User را در پایگاه داده ذخیره کنیم.
@Entity public class User { @Id private int id; private String name; private String location; public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
اکنون یک کلاس HibernateTest با متد main ایجاد میکنیم و یک Session Factory را در آن تعریف میکنیم.
public class HibernateTest { public static void main(String[] args) { SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); } }
در کد بالا, بر اساس تعریف های انجام شده در hibernate.cfg.xml یک Session Factory ایجاد کردیم. سپس نیاز است تا یک Session از Session Factory دریافت کنیم.
Session session = factory.openSession();
برای انجام تراکنش, نیاز است تا برای Session یک تراکنش را تعریف کنیم.
session.beginTransaction();
ذخیره یک Object در پایگاه داده با استفاده از Hibernate API, با استفاده از متد Save است.
session.save(user);
برای تثبیت اطلاعات در پایگاه داده از دستور Commit استفاده میشود. اما نیاز است تا Commit بر روی تراکنش مورد نظر انجام شود. به این ترتیب, ابتدا نیاز است تا تراکنش را دریافت و سپس Commit کنیم.
session.getTransaction().commit();
کد کامل به این صورت است:
public class HibernateTest { public static void main(String[] args) { SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); Session session = factory.openSession(); session.beginTransaction(); User user = new User(); user.setId(120); user.setName("Zero To Hero User"); user.setLocation("Iran"); session.save(user); session.getTransaction().commit(); } }
در این مقاله سعی شد تا مراحل تراکنش Hibernate با پایگاه داده مورد بررسی قرار گیرد و با استفاده از تعاریف گفته شده یک Object را در پایگاه داده ذخیره کنیم. همانطور که از ابتدا سری مقالات آموزش Hibernate مشاهده کردید, جدولی در پایگاه داده برای User تعریف نشده است. اما بعد از انجام کد فوق, یک جدول به نام User با ساختار کلاس User در جاوا و همچنین اطلاعات فوق, در پایگاه داده وجود دارد. این یکی از ویژگی هایی است که در مقاله اول بررسی کردیم و یکی از مزایای استفاده از Hibernate است.
در مقاله بعد استفاده از Annotation ها در Hibernate را مورد بررسی قرار میدهیم.
سری مقالات آموزش Java Enterprise ادامه دارد.
با ما همراه باشید.
مطالب زیر را حتما مطالعه کنید
از Java به Dart – کلاس و Constructor
آموزش Gradle – اهمیت Project Automation
تفاوت Sequence و List در کاتلین
بهترین محیط های توسعه(IDE) برای جاوا
Open/Closed Principle در قوانین Solid
توابع در زبان برنامه نویسی Kotlin
4 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام
در خطهای انتهایی این مقاله ذکر شده که “تمام کلاس ها باید از نوع Java Beans باشند.” . اگر ممکن است یک مقداری بیشتر این مورد را مورد موشکافی قرار دهید. چرا باید کلاسها از نوع Bean باشد؟
سلام دوست عزیز. ممنون از همراهیتون. ه
مونطور که در مقالات قبل و بعد هم وجود داره, این کلاس ها قراره به عنوان یک جدول در پایگاه داده ذخیره بشن. پس تمام خواصی که بتونه به عنوان نگهدارنده یک داده باشه, باید در کلاس قرار داشته باشه تا بتونه به درستی تبدیل کنه( مبحث ORM ). عملا Java Bean مدل های ما برای نگهداری اطلاعات هستند و دقیقا جداول هم همین کار انجام میدن ولی با فرمت متفاوت. در مقالات بعدی نشون داده شده که اگر بعضی کلاس ها به عنوان مدل داده ای در داخل Java Bean ها استفاده بشه, Hibernate به چه صورتی در داخل پایگاه داده ذخیره میکنه. بنابراین هر خاصیتی که در کلاس مدل ما قرار داره باید قابل تبدیل به مدل پایگاه داده ای باشه. برای نگهداری اطلاعات از متغیر ها استفاده میشه و برای دسترسی به متغیر ها هم از متد های getter و setter. کلاس هایی هم که این ساختار دارن در اصل Java Bean ها هستند.
خلاصه این توضحیات میشه این که ما قراره فقط داده ها رو نگهداری کنیم و بنابراین به مدل ها نیاز داریم. ساختار استاندارد هم برای نگهداری مدل ها ساختار Java Bean ها هست که بتونه به درستی به ساختار پایگاه داده ای تبدیل بشه.
اگر ابهامی مونده بفرمایید.
تشکر از راهنمایی بسیار دقیق. تعجب بسیار زیادی کردم از مطالب عالی سایت شما. آموزشها و مطالبی که به ندرت در زبان پارسی یافت میشود. امیدوارم مطالب بیشتری قرار دهید.
سلام. ممنون از همراهیتون دوست عزیز