فرهاد خانلری
کارشناس ارشد شبکه مایکروسافت

آموزش Hibernate در جاوا

مقدمه ای بر هایبرنیت ، هایبرنیت ورژن 3.0 آخرین ورژن متن باز تکنولوژی پایدار در قلب EJB 3.0 می باشد که از آدرس www.Hibernate.com در دسترس برای دانلود می باشد. هسته هایبرنیت شامل 68549 خط کد جاوا به همراه 27948 خط کد واحدهای تست آن می باشد که تحت LGPL به صورت آزاد می باشد و توسعه آن بیش از یک سال طول کشیده شده است. هایبرنیت کلاس های جاوا را به جداول پایگاه داده نگاشت می کند.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

همچنین امکانات بازیابی اطلاعات و ایجاد پرس و جو برروی آن ها را فراهم می کند و به طور موثری زمان توسعه نرم افزار را کاهش می دهد. هایبرنیت بهترین راه حل برای برنامه های مرکز داده ای که فقط از روال های ذخیره شده برای پیاده سازی منطق تجاری نرم افزار استفاده می کنند نیست.هایبرنیت بیشتر برای کاربردهایی که دامنه آن ها در مد شی گرایی می باشد و برای پیاده سازی منطق تجاری در لایه میانی که بر پایه جاوا می باشد مفید است.هایبرنیت به برنامه اجازه می دهد که بین هر پایگاه داده ای سوئیچ کند.هایبرنیت می تواند در برنامه های Swing جاوا و همچنین برنامه های مبتنی بر Servlet و یا در برنامه های J2EE به کار گرفته شود.

ویژگی های هایبرنیت

  • هایبرنیت 3.0 امکانات پرس وجو با خصوصیات کاملی را فراهم می کند. HQL نمونه جدید پیشرفته Hibernate Criteria Query API می باشد و برای پشتیبانی از زبان SQL توسعه داده شده است.
  • امکان فیلترگذاری برروی داده های موقت ، ناحیه ای فراهم می کند.
  • Enhanced Criteria query API برای پشتیبانی از عملگر پروژه و تجمع و Subselect ایجاد شده است.
  • کنترل کارایی در زمان اجرا از طریق JMX و یا APIمحلی جاوا شامل حافظه نهان سطح دوم کاوشگر.
  • پشتیبانی از اکلیپس شامل پلاگین اکلیپس برای کار با هایبرنیت شامل ویرایشگر نگاشت ، پرس و جوی نمونه ساز محاوره ای و ابزار مهندسی معکوس الگو.
  • هایبرنیت به صورت آزاد تحت LGPL می باشد و می توان از آن برای توسعه ، پکیج سازی و توزیع برنامه ها به صورت آزاد استفاده می شود.
  • هایبرنیت مقیاس پذیر می باشد. هایبرنیت بسیار کارا می باشد و به خاطر دولایه بودن معماری آن می تواند در محیط های خوشه بندی شده استفاده شود.
  • زمان توسعه کم تر: هایبرنیت زمان توسعه نرم افزار را کاهش می دهد چون از وراثت ، چند ریختی ، ترکیب و چارچوب کلکسیون جاوا پشتیبانی می کند.
  • تولید خود کار کلید اصلی : هایبرنیت کلید اصلی را به طور خود کار ایجاد می کند.
  • عملیات پایدار به سبک EJB3 : EJB3 عملیات Create() و Merge() را تعریف می کند که کمی متفاوت از عملیات SaveOrUpdate() و SaveOrUpdateCopy() در هایبرنیت می باشد. هایبرنیت هر چهار عمل را به صورت متد در رابط session پشتیبانی خواهد کرد.
  • پیوست XML هایبرنیت این اجازه را به داده ها می دهد که به صورت XML و POJO به صورت قابل تبادل نمایش داده شوند.

معماری هایبرنیت

در این بخش به شرح معماری هایبرنیت خواهیم پرداخت.

وب سایت توسینسو

شکل 1 تصویری از یک نمای سطح بالا از معماری هایبرنیت

شکل بالا نشان می دهد که هایبرنیت از پایگاه داده و داده های پیکربندی برای محیا کردن سرویس پایدار (و اشیاء پایدار) در برنامه استفاده می کند. استفاده از هایبرنیت نیاز به ایجاد کلاس های جاوا دارد که نمایان گر جدول در پایگاه داده می باشند و سپس نگاشت متغییر نمونه در کلاس با ستون ها در پایگاه داده . سپس هایبرنیت می تواند برای انجام عملیات انتخاب ، بروزرسانی ، درج و حذف رکوردهای جدول در پایگاه داده استفاده شود. هایبرنیت به صورت خود کار پرس و جوهایی برای انجام این کارها ایجاد می کند.

معماری هایبرنیت دارای 3 جزء اصلی می باشد.

  • مدیریت اتصال : سرویس مدیریت اتصال هایبرنیت مدیریت کارایی را برای اتصال های پایگاه داده فراهم می کند. اتصال پایگاه داده گران ترین بخش هنگام تعامل بایک پایگاه داده می باشد چون این اتصال منابع زیادی برای باز یا بسته بودن نیاز دارد.
  • مدیریت تراکنش : سرویس مدیریت تراکنش برای کاربر این توانایی را فراهم می کند که بیش از یک دستور پایگاه داده را در یک زمان اجرا کند.
  • نگاشت رابطه ای اشیاء : نگاشت رابطه ای اشیاءیک تکنیک برای نگاشت نمایش داده ازیک مدل اشیاء به مدل داده رابطه ای می باشد. این بخش از هایبرنیت برای انتخاب ، درج ، حذف و بروزرسانی رکوردها از جدول مورد نظر می باشد. هنگامی که ما یک شیء را به متد Session.save() می فرستیم، هایبرنیت وضعیت مغییرهای آن شیء را می خواند و پرس و جوی لازم را اجرا می کند.

تا هنگامی که نگاشت رابطه ای اشیاء اهمیت دارد هایبرنیت یک ابزار بسیار خوب می باشد اما در مورد مدیریت اتصال و مدیریت تراکنش ، هایبرنیت فاقد کارایی و توانایی می باشد. بنابراین معمولا هایبرنیت با مدیریت اتصال و مدیریت تراکنش دیگری استفاده می شود. برای مثال آپاچی DBCP برای ذخیره سازی یا انبارسازی اتصال ها با هایبرنیت استفاده می شود. هایبرنیت قابلیت انعطاف پذیری فراوانی را ایجاد می کند. هنگامی که ما فقط از قابلیت نگاشت اشیاء رابطه ای در هایبرنیت استفاده می کنیم این نوع معماری هایبرنیت معماری Lite نامیده می شود. درصورتی که در معماری Full Cream هر سه جزء معماری هایبرنیت (مدیریت اتصال ، مدیریت تراکنش ، نگاشت رابطه ای اشیاء) استفاده می شوند.

نوشتن اولین کد هایبرنیت

در این بخش خواهیم دید که چگونه می توان یک برنامه ساده برای درج یک رکورد در پایگاه داده MySQL ایجاد کرد. شما می توانید این برنامه را از اکلیپس و یا از خط فرمان اجرا کنید. من فرض می کنم که شما با MySQL و اکلیپس آشنایی دارید.

پیکربندی هایبرنیت

برای ساده سازی در این برنامه هایبرنیت از انبار سازی اتصال ها و مدیریت تراکنش استفاده کرده است. هایبرنیت از فایل hibernate.cfg.xml برای ایجاد انبار اتصال ها و برای برپا کردن محیط لازم استفاده می کند.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
      <property name="hibernate.connection.driver_class">
           com.mysql.jdbc.Driver
      </property>
      <property name="hibernate.connection.url">
            jdbc:mysql://localhost/hibernatetutorial
      </property>
      <property name="hibernate.connection.username">root</property>
      <property name="hibernate.connection.password"></property>
      <property name="hibernate.connection.pool_size">10</property>
      <property name="show_sql">true</property>
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name="hibernate.hbm2ddl.auto">update</property>
      <!-- Mapping files -->
      <mapping resource="contact.hbm.xml"/>
</session-factory>
</hibernate-configuration>

در فایل پیکربندی بالا تعیین کردیم که از پایگاه داده hibernatetutorial استفاده کنیم که برروی کامپیوتر localhost در حال اجرا می باشد و کاربر پایگاه داده root و بدون پسورد می باشد. خصوصیت dialect برابر org.hibernate.dialect.MySQLDialect می باشد که به هایبرنیت می گوید که درحال حاضر از پایگاه داده MySQL استفاده می کنیم. هایبرنیت پایگاه داده های زیادی را پشتیبانی می کند. با استفاده از هایبرنیت می توان از خصوصیات dialect زیر استفاده کرد.

  • DB2 - org.hibernate.dialect.DB2Dialect
  • HypersonicSQL - org.hibernate.dialect.HSQLDialect
  • Informix - org.hibernate.dialect.InformixDialect
  • Ingres - org.hibernate.dialect.IngresDialect
  • Interbase - org.hibernate.dialect.InterbaseDialect
  • Pointbase - org.hibernate.dialect.PointbaseDialect
  • PostgreSQL - org.hibernate.dialect.PostgreSQLDialect
  • Mckoi SQL - org.hibernate.dialect.MckoiDialect
  • Microsoft SQL Server - org.hibernate.dialect.SQLServerDialect
  • MySQL - org.hibernate.dialect.MySQLDialect
  • Oracle (any version) - org.hibernate.dialect.OracleDialect
  • Oracle 9 - org.hibernate.dialect.Oracle9Dialect
  • Progress - org.hibernate.dialect.ProgressDialect
  • FrontBase - org.hibernate.dialect.FrontbaseDialect
  • SAP DB - org.hibernate.dialect.SAPDBDialect
  • Sybase - org.hibernate.dialect.SybaseDialect
  • Sybase Anywhere - org.hibernate.dialect.SybaseAnywhereDialect

خصوصیت <mapping resource="contact.hbm.xml"/> نیز نگاشت جدول contact می باشد.

نوشتن اولین کلاس پایدار

هایبرنیت از کلاس های POJO برای نگاشت جداول پایگاه داده استفاده می کند. می توان متغیرها را برای نگاشت به ستون های پایگاه داده پیکربندی کرد.در زیر کد Contact.java موجود می باشد:

package roseindia.tutorial.hibernate;

/**
 * @author Deepak Kumar
 *
 * Java Class to map to the datbase Contact Table
 */
public class Contact {
  private String firstName;
  private String lastName;
  private String email;
  private long id;

  /**
   * @return Email
   */
  public String getEmail() {
    return email;
  }

  /**
   * @return First Name
   */
  public String getFirstName() {
    return firstName;
  }

  /** 
   * @return Last name
   */
  public String getLastName() {
    return lastName;
  }

  /**
   * @param string Sets the Email
   */
  public void setEmail(String string) {
    email = string;
  }

  /**
   * @param string Sets the First Name
   */
  public void setFirstName(String string) {
    firstName = string;
  }

  /**
   * @param string sets the Last Name
   */
  public void setLastName(String string) {
    lastName = string;
  }

  /**
   * @return ID Returns ID
   */
  public long getId() {
    return id;
  }

  /**
   * @param l Sets the ID
   */
  public void setId(long l) {
    id = l;
  }

}

در قسمت قبلی شروع کردیم به مباحث مقدماتی و معماری و ویژگی های هایبرنیت در جاوا در این قسمت به ادامه مطلب می پردازیم

نگاشت شیء Contact به جدول Contact در پایگاه داده

فایل Contact.hbm.xml برای نگاشت شیء contact به جدول contact در پایگاه داده استفاده می شود.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class name="roseindia.tutorial.hibernate.Contact" table="CONTACT">
   <id name="id" type="long" column="ID" >
   <generator class="assigned"/>
  </id>

  <property name="firstName">
     <column name="FIRSTNAME" />
  </property>
  <property name="lastName">
    <column name="LASTNAME"/>
  </property>
  <property name="email">
    <column name="EMAIL"/>
  </property>
 </class>
</hibernate-mapping>

برپا کردن پایگاه داده MySQL

در فایل پیکربندی hibernate.cfg.xml تعیین کرده ایم که از پایگاه داده hibernatetutorial که برروی کامپیوتر localhost اجرا شده است استفاده کنیم. بنابراین پایگاه داده hibernatetutorial را برروی کامپیوتر localhost ایجاد کنید.

ایجاد کد برای تست مثال هایبرنیت

حال آماده نوشتن یک برنامه برای درج داده در پایگاه داده هستیم. ماباید ابتدا مفهموم نشست هایبرنیت را بفهمیم. نشست هایبرنیت رابط اصلی زمان اجرا بین برنامه جاوا و هایبرنیت می باشد. ابتدا ما نیاز داریم که Session.SessionFctory هایبرنیت را دریافت کنیم که به برنامه اجازه می دهد که نشست هایبرنیت را با خواندن hibernate.cfg.xml ایجاد کند. سپس متد save در نشست برای ذخیره سازی اطلاعات contact در پایگاه داده استفاده می شود.

session.save(contact)

کد زیر مربوط به FirstExample.java می باشد.

package roseindia.tutorial.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;


/**
 * @author Deepak Kumar
 *
 * http://www.roseindia.net
 * Hibernate example to inset data into Contact table
 */
public class FirstExample {
  public static void main(String[] args) {
    Session session = null;

    try{
      // This step will read hibernate.cfg.xml 
and prepare hibernate for use
      SessionFactory sessionFactory = new 
Configuration().configure().buildSessionFactory();
       session =sessionFactory.openSession();
        //Create new instance of Contact and set 
values in it by reading them from form object
         System.out.println("Inserting Record");
        Contact contact = new Contact();
        contact.setId(3);
        contact.setFirstName("Deepak");
        contact.setLastName("Kumar");
        contact.setEmail("deepak_38@yahoo.com");
        session.save(contact);
        System.out.println("Done");
    }catch(Exception e){
      System.out.println(e.getMessage());
    }finally{
      // Actual contact insertion will happen at this step
      session.flush();
      session.close();

      }
    
  }
} 

در بخش بعدی نشان خواهم داد که چگونه می توان برنامه را اجرا کرده و آن را تست کنیم.هایبرنیت یک نرم افزار آزاد ومتن باز می باشد و می توانید آن را از سایت زیر دانلود کرده و آن را نصب کنید.

http://www.hibernate.org/30.html

اما من چیزهای زیادی را دریک فایل زیپ فراهم کرده ام. مثال ها و کتابخانه های کد را از لینک زیر دانلود کرده و آن را در پوشه مورد علاقه خود مثلا c:\hiebernateexample استخراج کنید.

http://www.roseindia.net/hibernate/hibernate.zip

برای اجرای مثال شما باید بروی کامپیوتر اکلیپس را نصب کنید. پروژه اکلیپس را شروع کرده و همان طور که در شکل زیر نشان داده شده است پروژه جاوا را انتخاب کنید.

وب سایت توسینسو
وب سایت توسینسو

برروی دکمه Next کلیک کرده و در صفحه بعدی مقدار پیش فرض فولدر خروجی را hibernateexample/bin رها کنید.

وب سایت توسینسو

برروی دکمه Finish کلیک کنید.حال همان طور که در شکل زیر نشان داده شده است فایل FirstExample.java را بازکنید.

وب سایت توسینسو

با استفاده از کاوشگر پنجره ها فایل های Contact.hbm.xml و hibernate.cfg.xml را درون پوشه bin پروژه کپی کنید.همان طور که در شکل نمایش داده شده است برای اجرای مثال منوی Run->Run As->Java Appication را انتخاب کنید.

وب سایت توسینسو

این کار باعث اجرای مثال هایبرنیت در اکلیپس شده و خروجی زیر در کنسول اکلیپس به نمایش درخواهد آمد.

وب سایت توسینسو

در این قسمت به شما نشان دادم که چگونه می توان مثال اول هایبرنیت را اجرا کرد.

فهم نگاشت O/R هایبرنیت

در آخرین مثال فایل contact.hbm.xml را برای نگاشت شیء contact به جدول Contact در ایجاد کردیم.حال بیایید هر کدام از اجزای فایل نگاشت را بفهمیم.برای یادآوری محتوای فایل contact.hbm.xml در زیر وجود دارد:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class name="roseindia.tutorial.hibernate.Contact" table="CONTACT">
   <id name="id" type="long" column="ID" >
   <generator class="assigned"/>
  </id>

  <property name="firstName">
     <column name="FIRSTNAME" />
  </property>
  <property name="lastName">
    <column name="LASTNAME"/>
  </property>
  <property name="email">
    <column name="EMAIL"/>
  </property>
 </class>
</hibernate-mapping>

فایل های نگاشت هایبرنیت فایل های ساده XML می باشند. در زیر برخی از عناصر مهم فایل نگاشت وجو دارند.

  1. عنصر <hibernate-mapping> : عنصر ابتدا یا ریشه سند نگاشت هایبرنیت عنصر <hibernate-mapping> می باشد. بین تگ های <hibernate-mapping> عناصر کلاس نمایش داده می شوند.
  2. عنصر <class> : عنصر <class> شیء کلاس را با موجودیت مرتبط با خود در پایگاه داده نگاشت می کند.همچنین مشخص می کند که کدام جدول در پایگاه داده باید دسترسی داشته باشد و کدام ستون در آن جدول باید استفاده شود.درون یک عنصر <hibernate-mapping> می تواند چندین عنصر<class> قرار گیرد.
  3. عنصر <id> : عنصر <id> یک شناسه خاصه (کلید اصلی) برای شناسایی یک شیء می باشد. در حقیقت عنصر <id> نگاشت کلید اصلی جدول را انجام می دهد. در کد ما :
<id name="id" type="long" column="ID" >

کلید اصلی به فیلد ID از جدول Contact نگاشت می شود.خصوصیات عنصر <id> عبارتند از :

  • Name : نام خصوصیتی که توسط کلاس پایدار استفاده می شود.
  • Column : ستونی که برای ذخیره سازی مقدار کلید اصلی استفاده می شود.
  • Type : نوع داده جاوای استفاده شده.
  • Unsaved-value : این مقدار برای تعیین این که اگر کلاس پایدار ایجاد شده است و اگر مقدار خصوصیت id برابر null می باشد نشان دهنده این است که این شیء پایدار نبوده است.

4. عنصر <generator> : متد <generator> برای ایجاد کلید اصلی برای رکورد جدید استفاده می شود.در زیر برخی از تولید کننده های رایج وجود دارند :

  • Increment : برای تولید کلید اصلی نوع long ، short یا int که فقط یکتا هستند ، استفاده می شود.
  • Sequence : هایبرنیت همچنین می تواند از ترتیب ها برای تولید کلید اصلی استفاده کند. می توان آن را با پایگاه داده های DB2 ، PostgreSQL ، Oracle ، SAP DB استفاده کرد.
  • Assigned : این روش زمانی استفاده می شود که کدهای برنامه برای تولید کلید اصلی استفاده می شوند.

5. عنصر <property> : عناصر <property> خصوصیات استاندارد جاوا و نگاشت آن ها به الگوی پایگاه داده را تعریف می کنند. عنصر <property> برای تعیین خصوصیات اضافی از عنصر <column-child> استفاده می کند. مانند نام شاخص در یک ستون و یا یک نوع خاص ستون.


فرهاد خانلری
فرهاد خانلری

کارشناس ارشد شبکه مایکروسافت

فرهاد خانلری ، مدرس شبکه و برنامه نویسی مبتنی بر زیرساخت های مایکروسافت ، سابقه فعالیت در موسسات و مراکز دولتی در قالب پروژه ، مشاوره و تدریس ، برنامه نویسی ++C ، سی شارپ و دات نت ، متخصص و مدرس شبکه های مبتنی بر سیستم عاملهای مایکروسافت و سرویس های مربوطه ، سخت افزار و ...

نظرات