مرحبًا بك في دليل Hibernate للمبتدئين. Hibernate هو أحد أدوات Java ORM الأكثر استخدامًا. يستخدم معظم التطبيقات قواعد بيانات علاقية لتخزين معلومات التطبيق، وعلى المستوى المنخفض نستخدم واجهة JDBC API للاتصال بقواعد البيانات وأداء عمليات CRUD.
دليل Hibernate للمبتدئين
إذا نظرت إلى كود JDBC، ستجد الكثير من الشيفرة الزائدة وهناك فرص لتسريب الموارد وعدم تناسق البيانات لأن كل العمل يحتاج ليتم من قبل المطور. هنا تأتي أداة ORM بمساعدة. تحويل الكائن إلى علاقي أو ORM هو تقنية البرمجة لتعيين كائنات نموذج المجال لتطبيق إلى جداول قواعد البيانات العلاقية. Hibernate هو أداة ORM مبنية على Java توفر إطارًا لتعيين كائنات نموذج المجال لجداول قواعد البيانات العلاقية والعكس بالعكس. بعض فوائد استخدام Hibernate كأداة ORM تشمل:
- يدعم Hibernate تعيين فئات Java إلى جداول قواعد البيانات والعكس بالعكس. يوفر ميزات لأداء عمليات CRUD عبر جميع قواعد البيانات العلاقية الرئيسية.
- يقضي Hibernate على جميع رموز البرنامج الرئيسية التي تأتي مع JDBC ويعتني بإدارة الموارد، بحيث يمكننا التركيز على حالات الاستخدام التجارية بدلاً من التأكد من أن عمليات قاعدة البيانات لا تسبب تسريبات في الموارد.
- يدعم Hibernate إدارة المعاملات ويتأكد من عدم وجود بيانات غير متناسقة في النظام.
- نظرًا لاستخدامنا لـ XML أو ملفات الخصائص أو التعليقات لتعيين فئات جافا لجداول قاعدة البيانات، فإنه يوفر طبقة تجريد بين التطبيق وقاعدة البيانات.
- يساعد Hibernate في رسم الانضمامات، وجمعيات البيانات، وكائنات التوريث ويمكننا بسهولة تصور كيف تمثل فئات النموذج لدينا جداول قاعدة البيانات.
- يوفر Hibernate لغة استعلام قوية (HQL) تشبه SQL. ومع ذلك، تكون HQL موجهة بالكامل نحو الكائنات وتفهم مفاهيم مثل التوريث والتعددية والربط.
- كما يقدم Hibernate أيضًا تكاملًا مع بعض الوحدات الخارجية. على سبيل المثال، Hibernate Validator هو التنفيذ المرجعي للتحقق من الشرائط (JSR 303).
- Hibernate هو مشروع مفتوح المصدر من مجتمع Red Hat ويستخدم على نطاق واسع. وهذا يجعله خيارًا أفضل من غيره لأن منحنى التعلم صغير وهناك الكثير من الوثائق عبر الإنترنت والمساعدة متاحة بسهولة في المنتديات.
- يسهل دمج Hibernate مع إطارات Java EE الأخرى، فهو شائع لدرجة أن إطار Spring يوفر دعمًا مدمجًا لدمج Hibernate مع تطبيقات 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 وكيفية عملها كطبقة تجريد بين فئات التطبيق وواجهات برمجة تطبيقات قواعد البيانات JDBC/JTA. من الواضح أن Hibernate مبني على قمة JDBC و JTA APIs. لنلقِ نظرة على المكونات الأساسية لهندسة Hibernate واحدة تلو الأخرى.
- SessionFactory (org.hibernate.SessionFactory): SessionFactory هي ذاكرة تخزين مؤقتة لا يمكن تغييرها وآمنة في الخيوط تحتوي على تطويقات مجمعة لقاعدة بيانات واحدة. يمكننا الحصول على مثيل من
org.hibernate.Session
باستخدامSessionFactory
. - Session (org.hibernate.Session): Session هو كائن ذو خيوط واحدة وعمر قصير يمثل محادثة بين التطبيق والمتجر المستمر. يلف JDBC
java.sql.Connection
ويعمل كمصنع لـ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
.
هايبرنيت وواجهة برمجة تطبيقات جافا (JPA)
هايبرنيت يوفر تنفيذًا لـ \\ واجهة برمجة تطبيقات الإصرار في جافا ، لذا يمكننا استخدام تعليقات JPA مع نماذج النمط وستعتني Hibernate بتكوينها لتستخدم في عمليات CRUD. سننظر إلى هذا بمثال توضيحي للتعليقات.
مثال Hibernate
عند تطوير تطبيقات Hibernate ، نحتاج إلى توفير مجموعتين من التكوين. تحتوي المجموعة الأولى من التكوينات على خصائص محددة لقاعدة البيانات التي سيتم استخدامها لإنشاء اتصال بقاعدة البيانات وكائنات الجلسة. تحتوي المجموعة الثانية من التكوينات على ربط بين فئات النموذج وجداول قاعدة البيانات. يمكننا استخدام تكوينات قائمة على XML أو الخصائص لتكوينات الاتصال بقاعدة البيانات. يمكننا استخدام تكوينات قائمة على XML أو تعليمات البرمجة لتوفير فئات النموذج وربط جداول قاعدة البيانات. سنستخدم تعليقات JPA من \\ javax.persistence
لتوفير تعيينات قائمة على التعليقات. سيبدو مشروعنا النهائي كما في الصورة أدناه. أنشئ مشروعًا Maven في Eclipse أو IDE المفضل لديك، يمكنك اختيار أي اسم تفضله. قبل أن ننتقل إلى مكونات المشروع المختلفة، سنحتاج إلى إعداد قاعدة البيانات.
إعداد جدول قاعدة البيانات
لمثالي، أستخدم قاعدة بيانات 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) لمشروعي العيني وأن Hibernate لا يزال في تطور، ولقد رأيت أن العديد من الفئات الأساسية تتغير بين كل إصدار رئيسي. لذا إذا كنت تستخدم أي إصدار آخر، هناك فرصة صغيرة أن تحتاج إلى تعديل تكوين Hibernate لجعله يعمل. ومع ذلك، أنا واثق من أنه سيعمل بشكل جيد لجميع إصدارات 4.x.x. Hibernate 4 يستخدم تسجيل JBoss ولكن الإصدارات القديمة تستخدم slf4j لأغراض التسجيل، لذا قمت بتضمين slf4j-simple في مشروعي، على الرغم من أنه غير مطلوب لأنني استخدم Hibernate 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
لتحديد فئة كفئة Entity Bean يمكن تخزينها بواسطة Hibernate، نظرًا لأن Hibernate يوفر تنفيذ JPA. يُستخدم تعليق javax.persistence.Table
لتعريف تعيين الجدول والقيود الفريدة للأعمدة. يُستخدم تعليق javax.persistence.Id
لتعريف المفتاح الرئيسي للجدول. يُستخدم javax.persistence.GeneratedValue
لتحديد أن الحقل سيتم إنشاءه تلقائيًا ويُستخدم استراتيجية GenerationType.IDENTITY بحيث يتم تعيين قيمة “id” المُنشأة على الشعار ويمكن استرجاعها في برنامج Java. يُستخدم javax.persistence.Column
لتعيين الحقل بعمود الجدول، ويمكننا أيضًا تحديد الطول وإمكانية الفراغ والفرادة لخصائص الفاصلة.
تكوين XML لتعيين Hibernate
كما هو مذكور أعلاه، سنستخدم تكوينًا قائمًا على XML لتعيين فئة الموظف. يمكننا اختيار أي اسم، ولكن من الجيد اختيار اسم يتناسب مع اسم الجدول أو جافا بين للوضوح. يبدو ملف تعيين Hibernate لكائن الموظف كما يلي. 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 بسيط ويقوم بنفس العمل كما يفعل التكوين المستند إلى التعليق.
ملفات تكوين Hibernate
سنقوم بإنشاء ملفات تكوين Hibernate 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، يمكننا تحديد ملفات تعيين Hibernate متعددة وتكوينها هنا. كما لاحظ أن التعيين محدد لمصنع الجلسة. 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);
//يمكننا تعيين ملف تعيين تصوير أو فئة بتعليق
//addClass(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 الخطوات التالية:
- إنشاء كائن
Configuration
وتكوينه - إنشاء كائن
ServiceRegistry
وتطبيق إعدادات التكوين. - استخدام
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 Annotation
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.
اختبار تكوين هيبرنيت جافا
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]
هذا كل شيء بالنسبة لدورة تعليم هيبرنيت للمبتدئين، آمل أن يكون كافياً لبدء رحلتك. سنتناول ميزات مختلفة في إطار هيبرنيت في الدروس المستقبلية. قم بتنزيل المشروع الكامل من الرابط أدناه والعب معه لتعلم المزيد.
Source:
https://www.digitalocean.com/community/tutorials/hibernate-tutorial-for-beginners