Hibernate چیست؟

Hibernate چیست؟

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

مقدمه

به جرات می‌توان گفت امروزه اغلب قریب به اتفاق برنامه‌هایی که نوشته می‌شوند از پایگاه داده استفاده می‌کنند پایگاه داده‌ها خود برنامه‌هایی هستند که کار ذخیره‌سازی و بازیابی داده‌ها را بر عهده دارند در برنامه‌ای که می‌نویسید می‌توانید از پایگاه داده استفاده نکنید اما در اینصورت باید درگیر بسیاری از مسائل و پیچیدگی‌های ذخیره سازی داده‌ها شوید. پایگاه داده‌ها با کارایی فراوان داده‌های شما را ذخیره می‌کنند و با کاستن از پیچیدگی‌های ذخیره‌سازی، امکان جستجوی سریع داده‌ها را فراهم می‌سازند.
برای اینکه در یک برنامه از پایگاه داده برای ذخیره سازی داده‌ها استفاده کنید اولا به یک برنامه واسط نیاز دارید تا از طریق آن به پایگاه داده متصل شوید به این برنامه واسط، راه انداز یا درایور گفته می‌شود ثانیاً به یک زبان مشترک نیاز است تا برنامه از طریق آن بتواند منظور خود را به پایگاه داده منتقل کند نام این زبان مشترک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 را آسان کرده و مدیریت تراکنش را تسهیل می کند.

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

میانگین ۰ / ۵. از مجموع ۰

اولین نفر باش

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

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

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

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

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

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

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

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

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

    • جالب بود
      ممنون

    • جالب بود
      ممنون