מדריך Hibernate למתחילים

ברוכים הבאים למדריך של Hibernate למתחילים. Hibernate הוא אחד מכלי ה-Java ORM הנפוצים ביותר. רוב היישומים משתמשים במסדי נתונים רלציוניים לאחסון מידע של היישום, וברמה הנמוכה אנו משתמשים ב-JDBC API להתחברות למסדי נתונים וביצוע פעולות CRUD.

מדריך Hibernate למתחילים

אם תסתכלו על קוד ה-JDBC, יש המון קוד דומה ויש סיכויים לחולשת משאב ואי עדכון של נתונים כי כל העבודה צריכה להיעשות על ידי המפתח. זהו המקום בו כלי ORM מגיע לידי ביטוי. מיפוי אובייקט-יחסים או ORM הוא טכניקת תכנות למפה אובייקטי דומיין של היישום לטבלאות מסד נתונים רלציוניות. Hibernate הוא כלי ORM בסגנון Java המספק תשתית למיפוי אובייקטי דומיין של היישום לטבלאות מסד נתונים ולהיפך. כמה מהיתרונות בשימוש ב-Hibernate ככלי ORM הם:

  1. ה-Hibernate תומך במיפוי של קבצי Java לטבלאות מסד נתונים ולהיפך. הוא מספק יכולות לביצוע פעולות CRUD בכל המסדים הרלציוניים המרכזיים.
  2. היברנייט מסיר את כל קוד השקלול שמגיע עם JDBC ודואג לניהול משאבים, כך שאנו יכולים להתמקד בתרחישי השימוש בעסקים במקום לוודא שפעולות בסיס הנתונים לא גורמות לדליפת משאבים.
  3. היברנייט תומך בניהול עסקאות ווודא שאין נתונים לא עקביים במערכת.
  4. מאחר שאנו משתמשים ב-XML, קבצי מאפיינים או הערות עבור מיפוי של מחלקות ג'אווה לטבלאות בסיס הנתונים, היברנייט מספק שכבת מחלקה בין היישום ובסיס הנתונים.
  5. היברנייט עוזר לנו במיפוי של שרשורים, אוספים, אובייקטי ירושה ואנו יכולים בקלות להחשיב איך המחלקות המודל שלנו מייצגות טבלאות בסיס הנתונים.
  6. היברנייט מספק שפה חזקה לשאילתות (HQL) שדומה ל-SQL. עם זאת, HQL היא לגמרי מבוססת עצמים ומבינה מושגים כמו ירושה, פולימורפיזם ושותפות.
  7. היברנייט מציע גם אינטגרציה עם חלק מודולים חיצוניים. לדוגמה, היברנייט ולידטור הוא היישום הרפרנס של אימות ה-Bean (JSR 303).
  8. היברנייט הוא פרויקט קוד פתוח מקהילת Red Hat ומשמש בכל רחבי העולם. זה עושה אותו בחירה טובה יותר מאחרים כי הקרבת למידה קטנה ויש המון מסמכים מקוונים ועזרה זמינה בפורומים בקלות.
  9. היברנייט קל לאינטגרציה עם מתכנתי Java EE פריימוורקים אחרים, זה כל כך פופולרי ש-סביבת ה-Spring מספקת תמיכה מובנית באינטגרציה של היברנייט עם יישומי Spring.

I hope all the above benefits will convince you that Hibernate is the best choice for your application object-relational mapping requirements. Let’s look at the Hibernate Framework architecture now and then we will jump into sample project where we will look into different ways to configure Hibernate in standalone java application and use it.

ארכיטקטורת Hibernate

התמונה למטה מציגה את ארכיטקטורת ה-Hibernate וכיצד היא פועלת כשכבת המסווג בין מחלקות היישום ו-APIs של JDBC/JTA לפעולות במסד הנתונים. ברור ש-Hibernate בנוי מעל JDBC ו-JTA APIs. בואו נסתכל על הרכיבים העיקריים של ארכיטקטורת Hibernate אחד-אחד.

  • SessionFactory (org.hibernate.SessionFactory): SessionFactory הוא מטמון בלתי ניתן לשינויים וקפיץ-חוטים המכיל מיפויים מהודקים עבור מסד נתונים יחיד. אנו יכולים לקבל אינסטנס של org.hibernate.Session באמצעות SessionFactory.
  • Session (org.hibernate.Session): Session הוא אובייקט קצר חיים ובסיסי שהמייצג דיבור בין היישום ואחסון התקשורת. הוא מעטיף את java.sql.Connection של JDBC ופועל כמפענח עבור org.hibernate.Transaction.
  • אובייקטים עמידים: אובייקטים עמידים הם אובייקטים קצרי חיים ובסיסיים המכילים מצב עמיד ופונקציות עסקיות. אלו יכולים להיות JavaBeans/POJOs רגילים. הם מתוארכים עם בדיוק אחד org.hibernate.Session.
  • אובייקטים חולפים: אובייקטים חולפים הם מופעים של מחלקות עמידות שאינם מקושרים כרגע ל-org.hibernate.Session. הם יכולים להיות יצורים על ידי היישום ועדיין לא נשמרו, או שיכולים להיות יצורים על ידי org.hibernate.Session שנסגר כבר.
  • עסקה (org.hibernate.Transaction): עסקה היא עצם בתהליך יחיד, בעל חיי קצרים, המשמש ליישום לציין יחידות עבודה אטומיות. היא מפשטת את היישום מהעסקאות JDBC או JTA המתרחשות מתחת לממשק. מופע של org.hibernate.Session יכול להיות נמשך על פני מספר org.hibernate.Transaction במקרים מסוימים.
  • ספק חיבור (org.hibernate.connection.ConnectionProvider): ספק החיבור הוא מפענח עבור חיבורי JDBC. הוא מספק הבדל בין היישום לבין javax.sql.DataSource או java.sql.DriverManager המתחת לממשק. הוא אינו נחשף ליישום, אך יכול להיות מורחב על ידי המפתח.
  • מפענח עסקה (org.hibernate.TransactionFactory): מפענח עסקה הוא מפענח עבור מופעי org.hibernate.Transaction.

Hibernate ו- Java Persistence API (JPA)

Hibernate מספקת יישום של Java Persistence API, כך שנוכל להשתמש באנוטציות JPA עם מחלקות המודל ו-Hibernate תדאג להגדיר אותו לשימוש בפעולות CRUD. נבחן זאת עם דוגמת אנוטציות.

דוגמת Hibernate

בפיתוח יישומים ב-Hibernate, עלינו לספק שני סטים של הגדרות. הסט הראשון של ההגדרות מכיל תכונות ספציפיות למסד נתונים שישמשו ליצירת חיבור למסד נתונים ואובייקטים של Session. הסט השני של ההגדרות מכיל מיפוי בין מחלקות המודל לטבלאות במסד הנתונים. נוכל להשתמש בהגדרות מבוססות XML או מבוססות תכונות עבור הגדרות הקשורות לחיבור למסד הנתונים. נוכל להשתמש בהגדרות מבוססות XML או מבוססות אנוטציות עבור הספקת מיפוי של מחלקות המודל וטבלאות במסד הנתונים. נשתמש באנוטציות JPA מ-javax.persistence עבור מיפויים מבוססי אנוטציות. הפרויקט הסופי שלנו יראה כמו בתמונה למטה. צור פרויקט Maven ב-Eclipse או בסביבת הפיתוח האהובה עליך, תוכל לתת לו כל שם לבחירתך. לפני שנמשיך לרכיבים השונים של הפרויקט, יהיה עלינו לבצע הכנה של מסד הנתונים.

הגדרת טבלת מסד נתונים

לדוגמה שלי, אני משתמש במסד נתונים של MySQL והסקריפט למטה משמש ליצירת טבלה נחוצה.

CREATE TABLE `Employee` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `role` varchar(20) DEFAULT NULL,
  `insert_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

שים לב שעמודת "id" בטבלת העובדים נוצרת אוטומטית על ידי MySQL, ולכן אין צורך להכניס אותה.

תלותי פרויקט Hibernate

הקובץ pom.xml הסופי שלנו נראה כך:

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.journaldev.hibernate</groupId>
  <artifactId>HibernateExample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>HibernateExample</name>
  
  <dependencies>
  	<dependency>
  		<groupId>org.hibernate</groupId>
  		<artifactId>hibernate-core</artifactId>
  		<version>4.3.5.Final</version>
  	</dependency>
  	<!-- Hibernate 4 uses Jboss logging, but older versions slf4j for logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
        	<groupId>mysql</groupId>
        	<artifactId>mysql-connector-java</artifactId>
        	<version>5.0.5</version>
        </dependency>
  </dependencies>
  
  <build>
  	<finalName>${project.artifactId}</finalName>
  </build>
</project>

הארטיפקט hibernate-core מכיל את כל המחלקות העיקריות של היברנייט, ולכן נקבל את כל התכונות הנחוצות על ידי כלולו בפרויקט. שים לב שאני משתמש בגרסה האחרונה של Hibernate (4.3.5.Final) לפרויקט הדוגמה שלי, והיברנייט עדיין בתהליך של תפוקה וראיתי שהמחלקות העיקריות שונות בין כל גרסה ראשית. אז אם אתה משתמש בגרסה אחרת, יש סיכוי קטן שיהיה עליך לשנות את ההגדרות של היברנייט כדי שזה יעבוד. אך אני בטוח שזה יעבוד בצורה תקינה לכל הגרסאות 4.x.x. Hibernate 4 משתמש בלוגינג של JBoss אך הגרסאות הישנות משתמשות ב־slf4j למטרות לוגינג, לכן כלולתי את slf4j-simple בפרויקט שלי, אף שאין צורך בזה כי אני משתמש בהיברנייט 4. mysql-connector-java הוא דרייבר MySQL להתחברות למסדי נתונים של MySQL, אם אתה משתמש במסד נתונים אחר אז יש להוסיף את הדרייבר המתאים.

כיתות מודל דומיין

כפי שאתה יכול לראות בתמונה לעיל, יש לנו שתי כיתות מודל, Employee ו־Employee1. Employee הוא כיתת Java Bean פשוטה ונשתמש בתצורה מבוססת XML כדי לספק פרטי המיפוי שלו. Employee1 הוא Java Bean שדותיו מוסמנים באנוטציות JPA, כך שאין צורך לספק מיפוי בקובץ XML נפרד.

package com.journaldev.hibernate.model;

import java.util.Date;

public class Employee {

	private int id;
	private String name;
	private String role;
	private Date insertTime;
	
	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;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public Date getInsertTime() {
		return insertTime;
	}
	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}
	
}

כיתת Employee היא Java Bean פשוטה, אין כאן דברים מסוימים לדון בהם.

package com.journaldev.hibernate.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name="Employee", 
	   uniqueConstraints={@UniqueConstraint(columnNames={"ID"})})
public class Employee1 {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="ID", nullable=false, unique=true, length=11)
	private int id;
	
	@Column(name="NAME", length=20, nullable=true)
	private String name;
	
	@Column(name="ROLE", length=20, nullable=true)
	private String role;
	
	@Column(name="insert_time", nullable=true)
	private Date insertTime;
	
	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;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public Date getInsertTime() {
		return insertTime;
	}
	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}
}

האנוטציה javax.persistence.Entity משמשת לסימון של כיתה כייבוש יישות שניתן לשמור על ידי Hibernate, מכיוון ש-Hibernate מספק יישום JPA. האנוטציה javax.persistence.Table משמשת להגדרת מיפוי הטבלה ואילוצים ייחודיים עבור העמודות. האנוטציה javax.persistence.Id משמשת להגדרת המפתח הראשי לטבלה. javax.persistence.GeneratedValue משמשת להגדרת כך שהשדה יווצר באופן אוטומטי והאסטרטגיה GenerationType.IDENTITY משמשת כך שערך "id" הנוצר ממופה ל-Bean וניתן לאחזר אותו בתוך תוכנית ה-Java. האנוטציה javax.persistence.Column משמשת למפה את השדה לעמודה בטבלה, ואפשר גם לציין אורך, האם הוא יכול להיות ריק והאם הוא ייחודי עבור מאפייני ה-Bean.

תצורת XML למיפוי היברנייט

כפי שנאמר לעיל, נשתמש בתצורת XML למיפוי של מחלקת העובד. ניתן לבחור כל שם, אך נעדיף לבחור שם הקשור לטבלה או לבונות ג'אווה למטרות בהירות. הקובץ המפות שלנו לבונת העובד נראה כמו בתיאור הבא. employee.hbm.xml

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

<hibernate-mapping>
	<class name="com.journaldev.hibernate.model.Employee" table="EMPLOYEE">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="role" type="java.lang.String">
            <column name="ROLE" />
        </property>
        <property name="insertTime" type="timestamp">
        	<column name="insert_time" />
        </property>
    </class>
</hibernate-mapping>

התצורה של ה-XML פשוטה ועושה את אותו הדבר כמו התצורה המבוססת על הערות.

קבצי התצורה של היברנייט

ניצור שני קבצי התצורה של היברנייט – אחד לתצורה מבוססת XML ואחד לתצורה מבוססת הערות. hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection properties - Driver, URL, user, password -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
		<property name="hibernate.connection.username">pankaj</property>
		<property name="hibernate.connection.password">pankaj123</property>
		<!-- Connection Pool Size -->
		<property name="hibernate.connection.pool_size">1</property>
		
		<!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Outputs the SQL queries, should be disabled in Production -->
		<property name="hibernate.show_sql">true</property>
		
		<!-- Dialect is required to let Hibernate know the Database Type, MySQL, Oracle etc
			Hibernate 4 automatically figure out Dialect from Database Connection Metadata -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 

		<!-- mapping file, we can use Bean annotations too --> 
		<mapping resource="employee.hbm.xml" />
	</session-factory>
</hibernate-configuration>

רוב המאפיינים קשורים לתצורת מסד נתונים, פרטי המאפיינים האחרים ניתנים בהערה. שימו לב לתצורת המיפוי של קובץ היברנייט, ניתן להגדיר קבצי מיפוי שונים רבים ולהגדיר אותם כאן. כמו כן שימו לב שהמיפוי הוא ספציפי לפבריקת הסשן. hibernate-annotation.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection properties - Driver, URL, user, password -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
		<property name="hibernate.connection.username">pankaj</property>
		<property name="hibernate.connection.password">pankaj123</property>
		
		<!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Mapping with model class containing annotations -->
		<mapping class="com.journaldev.hibernate.model.Employee1"/>
	</session-factory>
</hibernate-configuration>

רוב התצורה זהה לתצורת XML בעקרון, ההבדל היחיד הוא בתצורת המיפוי. ניתן לספק תצורת מיפוי עבור מחלקות וגם עבור חבילות.

מפעיל סשן של Hibernate

I have created a utility class where I am creating SessionFactory from XML based configuration as well as property based configuration. For property based configuration, we could have a property file and read it in the class, but for simplicity I am creating Properties instance in the class itself.

package com.journaldev.hibernate.util;

import java.util.Properties;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import com.journaldev.hibernate.model.Employee1;

public class HibernateUtil {

	//תצורה מבוססת XML
	private static SessionFactory sessionFactory;
	
	//תצורה מבוססת הערות
	private static SessionFactory sessionAnnotationFactory;
	
	//תצורה מבוססת מאפיינים
	private static SessionFactory sessionJavaConfigFactory;

    private static SessionFactory buildSessionFactory() {
        try {
            // יצירת סשן מתוך hibernate.cfg.xml
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate.cfg.xml");
        	System.out.println("Hibernate Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            //ודא שאתה מפעיל את החריגה, מאחר ויתכן ותתבלע
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    private static SessionFactory buildSessionAnnotationFactory() {
    	try {
            // יצירת סשן מתוך hibernate.cfg.xml
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate-annotation.cfg.xml");
        	System.out.println("Hibernate Annotation Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate Annotation serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            //ודא שאתה מפעיל את החריגה, מאחר ויתכן ותתבלע
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}

    private static SessionFactory buildSessionJavaConfigFactory() {
    	try {
    	Configuration configuration = new Configuration();
		
		//צור מאפיינים, ניתן לקרוא גם מקבצי מאפיינים
		Properties props = new Properties();
		props.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
		props.put("hibernate.connection.url", "jdbc:mysql://localhost/TestDB");
		props.put("hibernate.connection.username", "pankaj");
		props.put("hibernate.connection.password", "pankaj123");
		props.put("hibernate.current_session_context_class", "thread");
		
		configuration.setProperties(props);
		
		//ניתן להגדיר קובץ מיפוי או מחלקה עם הערות
		//הוסףClass(Employee1.class) יחפש משאב
		// com/journaldev/hibernate/model/Employee1.hbm.xml (לא טוב)
		configuration.addAnnotatedClass(Employee1.class);
		
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    	System.out.println("Hibernate Java Config serviceRegistry created");
    	
    	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    	
        return sessionFactory;
    	}
        catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}
    
	public static SessionFactory getSessionFactory() {
		if(sessionFactory == null) sessionFactory = buildSessionFactory();
        return sessionFactory;
    }
	
	public static SessionFactory getSessionAnnotationFactory() {
		if(sessionAnnotationFactory == null) sessionAnnotationFactory = buildSessionAnnotationFactory();
        return sessionAnnotationFactory;
    }
	
	public static SessionFactory getSessionJavaConfigFactory() {
		if(sessionJavaConfigFactory == null) sessionJavaConfigFactory = buildSessionJavaConfigFactory();
        return sessionJavaConfigFactory;
    }
	
}

יצירת SessionFactory עבור תצורה מבוססת XML זהה בין אם המיפוי מבוסס על XML או על הערות. עבור תצורה מבוססת מאפיינים, אנו צריכים להגדיר את המאפיינים באובייקט Configuration ולהוסיף כיתות הערות לפני יצירת SessionFactory. בגורלו, יצירת SessionFactory כוללת את השלבים הבאים:

  1. יצירת אובייקט Configuration ותצורתו
  2. יצירת אובייקט ServiceRegistry ויישום הגדרות התצורה.
  3. שימוש ב- configuration.buildSessionFactory() על ידי מעבר של אובייקט ServiceRegistry כארגומנט כדי לקבל את אובייקט ה- SessionFactory.

היישום שלנו כמעט מוכן כעת, בואו נכתוב כמה תוכניות בדיקה ונפעיל אותן.

בדיקת הגדרות Hibernate XML

התוכנית הבדיקה שלנו נראית כמו שמופיע למטה.

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;

import com.journaldev.hibernate.model.Employee;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateMain {

	public static void main(String[] args) {
		Employee emp = new Employee();
		emp.setName("Pankaj");
		emp.setRole("CEO");
		emp.setInsertTime(new Date());
		
		//קבלת סשן
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		//התחל העסקה
		session.beginTransaction();
		//שמור את אובייקט המודל
		session.save(emp);
		//אישור העסקה
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//סיום מפעל הסשן, אחרת התוכנית לא תסתיים
		HibernateUtil.getSessionFactory().close();
	}

}

התוכנית היא ברורה מאליו, כאשר אנו מפעילים את תוכנית הבדיקה, אנו מקבלים את הפלט הבא.

May 06, 2014 12:40:06 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:40:06 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:40:06 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:40:06 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 06, 2014 12:40:06 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
May 06, 2014 12:40:06 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
May 06, 2014 12:40:07 AM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: employee.hbm.xml
May 06, 2014 12:40:08 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Configuration loaded
Hibernate serviceRegistry created
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
May 06, 2014 12:40:08 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:40:08 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:40:08 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select max(ID) from EMPLOYEE
Hibernate: insert into EMPLOYEE (NAME, ROLE, insert_time, ID) values (?, ?, ?, ?)
Employee ID=19
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

שים לב שהיא מדפיסה את מזהה העובד הנוצר, תוכל לבדוק את טבלת המסד נתונים לאימות זאת.

בדיקת הגדרות Hibernate באמצעות הערות

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.journaldev.hibernate.model.Employee1;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateAnnotationMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("David");
		emp.setRole("Developer");
		emp.setInsertTime(new Date());
		
		//קבלת סשן
		SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory();
		Session session = sessionFactory.getCurrentSession();
		//התחל העסקה
		session.beginTransaction();
		//שמור את אובייקט המודל
		session.save(emp);
		//אישור העסקה
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//סיום מפעל הסשן, אחרת התוכנית לא תסתיים
		sessionFactory.close();
	}

}

כאשר אנו מפעילים את התוכנית למעלה, אנו מקבלים את הפלט הבא.

May 06, 2014 12:42:22 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:42:22 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:42:22 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:42:22 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 06, 2014 12:42:22 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate-annotation.cfg.xml
May 06, 2014 12:42:22 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate-annotation.cfg.xml
May 06, 2014 12:42:23 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Annotation Configuration loaded
Hibernate Annotation serviceRegistry created
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 06, 2014 12:42:23 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:42:23 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:42:23 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Employee ID=20
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

ראה את הפלט והשווה אותו עם הפלט מתוך התצורה המבוססת על XML, תגלה כמה הבחנים. לדוגמה, אנו לא מגדירים גודל קופסת החיבור עבור התצורה המבוססת על הערות, ולכן זה מוגדר לערך ברירת המחדל של 20.

מבחן הגדרות Hibernate ב-Java

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.journaldev.hibernate.model.Employee1;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateJavaConfigMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("Lisa");
		emp.setRole("Manager");
		emp.setInsertTime(new Date());
		
		//קבל סשן
		SessionFactory sessionFactory = HibernateUtil.getSessionJavaConfigFactory();
		Session session = sessionFactory.getCurrentSession();
		//התחל עסקה
		session.beginTransaction();
		//שמור על אובייקט המודל
		session.save(emp);
		//בצע עסקה
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//סיים מפעל הסשן, אחרת התוכנית לא תסתיים
		sessionFactory.close();
	}

}

פלט מתוך תוכנית הבדיקה הנדסית לעיל הוא:

May 06, 2014 12:45:09 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:45:09 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:45:09 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:45:09 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Hibernate Java Config serviceRegistry created
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 06, 2014 12:45:10 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
May 06, 2014 12:45:10 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:45:10 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:45:10 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Employee ID=21
May 06, 2014 12:45:10 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

זהו הכל למדריך Hibernate למתחילים, אני מקווה שזה יהיה מספיק כדי להתחיל לך. נבחן תכונות שונות של מסגרת Hibernate במדריכים עתידיים. הורד את הפרויקט המלא מהקישור למטה ושחק איתו כדי ללמוד עוד.

הורד את פרויקט ההתחלה של Hibernate

Source:
https://www.digitalocean.com/community/tutorials/hibernate-tutorial-for-beginners