Hibernate چیست؟

Hibernate چیست؟

نوشته شده توسط: احمد رضا صدیقی
۱۶ شهریور ۱۳۹۸
زمان مطالعه: 16 دقیقه
0
(0)

مقدمه

به جرات می‌توان گفت امروزه اغلب قریب به اتفاق برنامه‌هایی كه نوشته می‌شوند از پایگاه داده استفاده می‌كنند پایگاه داده‌ها خود برنامه‌هایی هستند كه كار ذخیره‌سازی و بازیابی داده‌ها را بر عهده دارند در برنامه‌ای كه می‌نویسید می‌توانید از پایگاه داده استفاده نكنید اما در اینصورت باید درگیر بسیاری از مسائل و پیچیدگی‌های ذخیره سازی داده‌ها شوید. پایگاه داده‌ها با كارایی فراوان داده‌های شما را ذخیره می‌كنند و با كاستن از پیچیدگی‌های ذخیره‌سازی، امكان جستجوی سریع داده‌ها را فراهم می‌سازند.
برای اینكه در یك برنامه از پایگاه داده برای ذخیره سازی داده‌ها استفاده كنید اولا به یك برنامه واسط نیاز دارید تا از طریق آن به پایگاه داده متصل شوید به این برنامه واسط، راه انداز یا درایور گفته می‌شود ثانیاً به یك زبان مشترك نیاز است تا برنامه از طریق آن بتواند منظور خود را به پایگاه داده منتقل كند نام این زبان مشترکSQL است. SQL مجموعه‌ای از لغات و عبارات استاندارد برای ذخیره‌سازی و بازیابی داده‌ها از پایگاه داده تعریف می‌كند.

برای اینكه در یك برنامه جاوا بتوان از پایگاه داده استفاده نمود مجموعه‌ای از كلاسها و اینترفیس‌ها تعریف شده‌اند كه به آنAPI JDBC گفته می‌شود با استفاده از این API می‌توانید جملاتSQL خود را بواسطة درایور به پایگاه داده منتقل كنید یا نتایج جستجو را بازیابی كنید.اما اگرچه جاوا و JDBC كار ارتباط با پایگاه داده و تبادل اطلاعات با آن را بسیار تسهیل كرده‌اند و بسیاری از مسائل این زمینه توسط آنها حل شده است اما مشكلی كه در حال حاضر وجود دارد این است كه برنامه‌های جاوا، اساساً برنامه‌های شی‌گرا هستند در حالیكه پایگاه داده‌ها، داده‌ها را به صورت غیر شی‌گرا و رابطه‌ای (پاورقی: Relational) ذخیره می‌كند ارتباط دنیای شی‌گرا با دنیای رابطه‌ای به نوبه خود بوجود آورنده بسیاری از مسائل است كه توسط جاوا و JBDC حل نشده است.
بنابراین وقتی در یك برنامه شی‌گرا از یک پایگاه داده رابطه‌ای برای ذخیره داده‌های برنامه استفاده می‌کنید خودتان مسئولیت تبدیل داده‌های شی گرا به رابطه‌ای و بالعکس را برعهده خواهید داشت.
برای درك بهتر مساله، فرض كنید در یك برنامه كلاسی به نام Student وجود دارد كه داده‌های یك دانش آموز را نگهداری می‌كند در پایگاه داده نیز جدولی با نام STUDENT طراحی كرده‌اید كه داده‌های آبجكت‌های Student را ذخیره می‌كنید.

public class Student {
    private int id;
    private String name;
    private String family;
    //constructor
    //setter and getter
}

اگر بخواهید اطلاعات یک ردیف جدول STUDENT را در قالب یک آبجکت Student بخوانید، نیاز به نوشتن کدهای زیر در یک برنامة جاوا خواهید داشت:

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class StudentDAO {
public final static Logger log = Logger.getLogger(StudentDAO.class);
    public static Student getStudent(int studentId) throws DaoException{
        Connection c = null;
        PreparedStatement p = null;
        Student student = null;
        try {
            Class.forName("org.postgresql.Driver");
            c = DriverManager.getConnection(
      "jdbc:postgresql://127.0.0.1/hibernate",
                    "hibernate",
                    "hibernate");
            p = c.prepareStatement(
    "select student from STUDENT where id = ?");
            p.setInt(1, studentId);
            ResultSet rs = p.executeQuery();
            if (rs.next()) {
                String name = rs.getString(1);
                String family = rs.getString(2);
                student = new Student(studentId, name, family);
                if (rs.next()) {
                    log.warning("Multiple students retrieved" +
        " for student ID: " + studentId);
                }
            }
        } catch (Exception e) {
          log.log(Level.SEVERE, "Could not acquire student",e);
            throw new DaoException(
       "Failed to retrieve student from the database.",e);
        } finally {
            if (p != null) {
                try {
                    p.close();
                } catch (SQLException e) {
                    log.log(Level.WARNING,
                          "Could not close ostensibly "+
          "open statement.", e);
                }
            }
            if (c != null) {
                try {
                    c.close();
                } catch (SQLException e) {
                    log.log(Level.WARNING,
                            "Could not close ostensibly"+
          " open connection.", e);
                }
            }
        }
        return student;
    }
}

متدgetStudent()، شناسه یک دانش آموز را دریافت می‌کند و اطلاعات کامل یک ردیف جدول STUDENT را در قالب یک آبجکت Student برمی‌گرداند.
یكی از مشكلاتی كه JDBC آنرا حل نكرده است ذخیره و بازیابی داده‌های شی‌گرا در یک «پایگاه داده رابطه‌ای» است همانطور كه در متد فوق ملاحظه می‌كنید مقدار هریک از ستون‌های جدول، خوانده شده و سپس در فیلدهای آبجکت Student مقداردهی می‌شوند.
اگرچه مشكل فوق، یكی از جدی ترین مسائل استفاده از JDBC است اما درعمل مسائل  زیادی وجود دارد كه توسط JDBC حل نشده است. به عنوان مثال در صورتیكه یك آبجكت از یك آبجكت دیگر ارث برده باشد (inheritance) ذخیره سازی آنها به چه صورت باید انجام شود؟ چه جدول یا جدول‌هایی باید برای ذخیره سازی چنین آبجکتی طراحی شود؟

Hibernate، در حقیقت ابزاری است كه توسط آن می‌توان بر بسیاری از این مشكلات غلبه كرد با استفاده از Hibernate می‌توان پایگاه داده را به صورت شی‌گرا تصور كرد و به این ترتیب مسئله نگاشت دنیای شی گرا و دنیای رابطه‌ای از میان خواهد رفت. Hibernate همانند پلی است كه ارتباط دنیای شی‌گرا با دنیای رابطه‌ای را برقرار می‌كند. وقتی از Hibernate استفاده می‌شود، تمام عملیات تبادل داده ها بین دنیای شی گرا و دنیای رابطه ای، به عهده Hibernate خواهد بود، ذخیره سازی، بروزرسانی، حذف و جستجوی آبجکت‌ها بدون توجه به شکل رابطه‌ای داده‌ها انجام خواهد شد گذشته از این مسئله، Hibernate كارایی برنامه را افزایش داده ، كدهای برنامه را زیبا و خوانایی آنها را بالا می‌برد.Hibernate كاملا منطبق بر شی‌گرایی است با استفاده از آن می‌توان علاوه بر ذخیره نمودن آبجکت‌ها، رابطه بین آن‌ها را نیز ذخیره کرد روابط Compostion، Association، Inheritance به خوبی با استفاده از Hibernate قابل ذخیره سازی هستند همچنین Hibernate می‌تواند با Cache كردن داده‌ها كارایی و سرعت برنامه را به طرز قابل ملاحظه‌ای افزایش دهد. Cache كردن اصطلاحا به عملیاتی گفته می‌شود كه طی آن، داده‌هایی از پایگاه داده كه بسیار مورد استفاده قرار می‌گیرند در حافظه نگهداری می‌شوند تا در دفعات بعدی كه به آن‌ها نیاز است به جای مراجعه مجدد به پایگاه داده (و در نتیجه كاهش كارایی و سرعت برنامه) از حافظه خوانده شود و كارایی بهبود یابد.اگرچه Hibernate پراستفاده ترین ابزار ذخیره سازی داده‌های شی گرا و واسط دنیای شی‌گرا و رابطه‌ای است، اما به جای آن می‌توانید از ابزارهای دیگری که به همین منظور طراحی شده‌اند نیز استفاده کنید به این گونه ابزارهای که ارتباط بین دنیای شی گرا و دنیای رابطه‌ای را برقرار می‌کنند اصطلاحا O/R Mapping گفته می‌شود. از دیگر ابزارهای O/R Mapping موجود می‌توان به MyBatis، OpenJPA و ‌ EclipseLinkاشاره كرد.
درمقایسه با بسیاری از دیگر ابزارهای O/R Mapping، استفاده از Hibernate بسیار آسان است تنظیم آن ساده بوده و اجرای آن نیاز به هیچ محیط اجرایی ندارد فقط كافی است جاوا استاندارد را داشته باشید، از Hibernate می‌توانید در هر برنامه جاوا، اعم از وب یا غیر وب استفاده كنید.

به عنوان آخرین نكته به خاطر داشته باشید كه Hibernate ابزاری است كه با استفاده از JBDC با پایگاه داده ارتباط برقرار می‌کند و با استفاده از آن هر برنامه شی‌گرا را از مسایل و مشكلات نگهداری داده‌های رابطه‌ای رهایی می‌دهد بنابراین Hibernate جایگزینی برای JDBC محسوب نمی‌شود بلكه ابزاری است كه خود با استفاده از JDBC با پایگاه داده ارتباط برقرار نموده و برای برنامه، یك نمای شی‌گرا از پایگاه داده فراهم می‌كند. در اغلب موارد، Hibernate به همراه ابزار دیگری به نام Spring استفاده می‌شود اگرچه می‌توان، Hibernate را به تنهایی استفاده نمود اما بكارگیری Spring، استفاده از Hibernate را آسان کرده و مدیریت تراکنش را تسهیل می کند.

چه رتبه ای می‌دهید؟

میانگین 0 / 5. از مجموع 0

اولین نفر باش

title sign
معرفی نویسنده
احمدرضا صدیقی
مقالات
6 مقاله توسط این نویسنده
محصولات
5 دوره توسط این نویسنده
احمدرضا صدیقی

احمدرضا صدیقی متخصص و معمار ارشد جاوا است. از دیگر سوابق حرفه ای او می توان به:معمار ارشد در حوزه جاوا مربوط به پروژه دانشگاه علوم پزشکی، معمار ارشد در حوزه جاوا مربوط به پروژه شرکت خبره پردا، معمار ارشد در حوزه جاوا مربوط به پروژه شرکت کیاتک بنیا، معمار ارشد در حوزه جاوا مربوط به پروژه دانشگاه مالک اشتر، مشاور پروژه‌ ملی طرح جامع مالیاتی، مشاور پروژه‌ ملی وزارت بهداشت، مشاور پروژه‌ بانک ملت، مولف مجموعه کتاب‌های جاوا (فارسی و انگلیسی)، بیش از ۱۲ سال سابقه تدریس جاوا، ارائه فریم‌ورک تخصصی جاوا (اطلس) اشاره کرد.

پروفایل نویسنده
title sign
معرفی محصول
title sign
دیدگاه کاربران

    • بسیار عالی، روان و قابل فهم بود .
      سپاس فراوان

    • بسیار عالی، روان و قابل فهم بود .
      سپاس فراوان

    • خیلی خوب توضح دادین
      ممنون

    • خیلی خوب توضح دادین
      ممنون

    • سلام ممنون از مقاله ی خوبتون
      فقط اینکه مطالب این مقاله در کتابتون عنوان شده ؟

  • 1
  • 2