مشخصات مقاله
-
556
-
0.0
-
2718
-
0
-
0
آموزش Spring with Hibernate- Java Spring
اسپرینگ با Hibernate
ادغام اسپرینگ و Hibernate
به سادگی می توانیم برنامه های کاربردی hibernate را با برنامه¬های کاربردی اسپرینگ ادغام کنیم. در فریمورک hibernate تمامی اطلاعات پایگاه داده را در فایل hibernate.cfg.xml آماده می¬کنیم. اما اگر بخواهیم برنامه های کاربردی hibernate را با اسپرینگ ادغام کنیم، نیازی به ایجاد فایل hibernate.cfg.xml نداریم. تمامی اطلاعات مورد نیاز را در فایل applicationContext.xml می توانیم ارائه دهیم.
مزیت فریمورک اسپرینگ با hibernate
فریمورک اسپرینگ کلاس HibernateTemplate را ارائه می کند، در نتیجه نیاز به طی کردن مراحل زیادی مانند ایجاد پیکربندی(create Configuration)، BuildSessionFactory، جلسه(Session)، شروع و انجام معاملات(beginning and committing transaction) و غیره ندارید. در نتیجه حجم زیادی از کد کاسته می¬شود.
درک مشکل بدون استفاده از اسپرینگ
بر اساس کد hibernate در زیر بررسی می کنیم:
//creating configuration
Configuration cfg=new Configuration();
cfg.configure("hibernate.cfg.xml");
//creating seession factory object
SessionFactory factory=cfg.buildSessionFactory();
//creating session object
Session session=factory.openSession();
//creating transaction object
Transaction t=session.beginTransaction();
Employee e1=new Employee(111,"arun",40000);
session.persist(e1);//persisting the object
t.commit();//transaction is commited
session.close();
همانطور که در کد hibernate تنها می بینید، مراحل زیادی را باید طی کنید.
راه حل با استفاده از کلاس HibernateTemplate از فریمورک اسپرینگ:
حال نیاز به طی کردن مراحل زیادی ندارید. به سادگی می توانید کد زیر را بنویسید.
Employee e1=new Employee(111,"arun",40000); hibernateTemplate.save(e1);
متدهای کلاس HibernateTemplate
متدهایی از کلاس HibernateTemplate که معمولا مورد استفاده قرار می گیرند را بررسی می کنیم.
1- void persist(Object entity) : شی داده شده را حفظ می کند.
2- Serializable save(Object entity): شی داده شده را حفظ می کند و شناسه را باز می گرداند.
3- void saveOrUpdate(Object entity) : شی داده شده را حفظ یا به روز رسانی می کند. اگر شناسه پیدا شود، رکورد را به روز رسانی می کند، در غیر این صورت رکورد را ذخیره می کند.
4- void update(Object entity) :شی داده شده را به روز رسانی می کند.
5- void delete(Object entity) : بر مبنای شناسه، شی داده شده را حذف می کند.
6- Object get(Class entityClass, Serializable id) : بر مبنای شناسه داده شده، شی حفظ شده را باز می گرداند.
7- Object load(Class entityClass, Serializable id) : بر مبنای شناسه داده شده، شی حفظ شده را باز می گرداند.
8- List loadAll(Class entityClass): تمامی اشیای حفظ شده را باز می گرداند.
مراحل
بیایید مراحل ساده ادغام hibernate و اسپرینگ را با هم ببینیم:
1. ایجاد جدول در پایگاه داده. این مورد اختیاری است.
2. ایجاد فایل applicationContext.xml . این فایل شامل اطلاعاتی از DataSource و SessionFactoy است.
3. ایجاد فایل Employee.java. این فایل کلاس persistent است.
4. ایجاد فایل employee.hbm.xml. این فایل نگاشت است.
5. ایجاد فایل EmployeeDao.java. این فایل کلاس dao است که از قالب hibernate استفاده می کند.
6. ایجاد فایل InsertTest.java. این فایل متدهای کلاس EmployeeDao را فراخوانی می کند.
مثال ادغام hibernate و اسپرینگ
در این مثال می خواهیم برنامه کاربردی hibernate را با اسپرینگ ادغام کنیم. ساختار دایرکتوری مثال اسپرینگ و hibernate را با هم می بینیم.
1. ایجاد جدول در پایگاه داده
در این مثال، از Oracle به عنوان پایگاه داده استفاده می کنیم اما شما می¬توانید از هر پایگاه داده دیگری نیز استفاده کنید. حال جدول را در پایگاه داده Oracle ایجاد می کنیم.
CREATE TABLE "EMP558"
( "ID" NUMBER(10,0) NOT NULL ENABLE,
"NAME" VARCHAR2(255 CHAR),
"SALARY" FLOAT(126),
PRIMARY KEY ("ID") ENABLE
)
/
2. Employee.Java
این یک کلاس ساده POJO است. در اینجا به عنوان کلاس persistent برای hibernate کار می کند.
package com.javatpoint;
public class Employee {
private int id;
private String name;
private float salary;
//getters and setters
}
3. employee.hbm.xml
این فایل نگاشت شامل همه اطلاعات کلاس persistent است.
< ?xml version='1.0' encoding='UTF-8' ?>
< !DOCTYPE hibernate-mapping PUBLIC
3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
< hibernate-mapping>
< class name="com.javatpoint.Employee" table="emp558">
< id name="id">
< generator class="assigned">< /generator>
< /id>
< property name="name">< /property>
< property name="salary">< /property>
< /class>
< /hibernate-mapping>
4. EmployeeDao.java
این یک کلاس جاوا(java) است که برای حفظ شی کلاس Employee از متد کلاس HibernateTemplate استفاده می کند.
package com.javatpoint;
import org.springframework.orm.hibernate3.HibernateTemplate;
import java.util.*;
public class EmployeeDao {
HibernateTemplate template;
public void setTemplate(HibernateTemplate template) {
this.template = template;
}
//method to save employee
public void saveEmployee(Employee e){
template.save(e);
}
//method to update employee
public void updateEmployee(Employee e){
template.update(e);
}
//method to delete employee
public void deleteEmployee(Employee e){
template.delete(e);
}
//method to return one employee of given id
public Employee getById(int id){
Employee e=(Employee)template.get(Employee.class,id);
return e;
}
//method to return all employees
public List< Employee> getEmployees(){
List< Employee> list=new ArrayList< Employee>();
list=template.loadAll(Employee.class);
return list;
}
}
5. applicationContext.xml
در این فایل، تمامی اطلاعات پایگاه داده را در شی BasicDataSource آماده می کنیم. این شی در شی کلاس LocalSessionFactoryBean مورد استفاده قرار می گیرد و شامل اطلاعات دیگری از جمله منابع نگاشت (mappingResources) و ویژگی های hibernate(hibernateProperties) است. شی کلاس LocalSessionFactoryBean در کلاس HibernateTemplate مورد استفاده قرار می گیرد. حال کد فایل applicationContext.xm را با هم می بینیم.
File: applicationContext.xml
< ?xml version="1.0" encoding="UTF-8" ?>
< beans 3. xmlns="http://www.springframework.org/schema/beans"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xmlns:p="http://www.springframework.org/schema/p"
6. xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
< bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
< property name="driverClassName" value="oracle.jdbc.driver.OracleDriver">< /property>
< property name="url" value="jdbc:oracle:thin:@localhost:1521:xe">< /property>
< property name="username" value="system">< /property>
< property name="password" value="oracle">< /property>
< /bean>
< bean id="mysessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
< property name="dataSource" ref="dataSource">< /property>
< property name="mappingResources">
< list>
< value>employee.hbm.xml< /value>
< /list>
< /property>
< property name="hibernateProperties">
< props>
< prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect< /prop>
< prop key="hibernate.hbm2ddl.auto">update< /prop>
< prop key="hibernate.show_sql">true< /prop>
< /props>
< /property>
< /bean>
< bean id="template" class="org.springframework.orm.hibernate3.HibernateTemplate">
< property name="sessionFactory" ref="mysessionFactory">< /property>
< /bean>
< bean id="d" class="com.javatpoint.EmployeeDao">
< property name="template" ref="template">< /property>
< /bean>
< /beans>
6. InsertTest.java
این کلاس از شی کلاس EmployeeDao استفاده می کند و متد saveEmployee آن را با پاس دادن شی کلاس Employee فراخوانی می کند.
package com.javatpoint;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class InsertTest {
public static void main(String[] args) {
Resource r=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(r);
EmployeeDao dao=(EmployeeDao)factory.getBean("d");
Employee e=new Employee();
e.setId(114);
e.setName("varun");
e.setSalary(50000);
dao.saveEmployee(e);
}
}
حال اگر در پایگاه داده Oracle جدول را ببینید، رکورد با موفقیت درج شده است.
فعال کردن قابلیت ایجاد خودکار جدول، نمایش sql query ها
می توان ویژگی های زیادی از hibernate مانند ایجاد خودکار جدول را با استفاده از hbm2ddl.auto در فایل applicationContext.xm فعال کرد. حال کد را می بینیم:
< property name="hibernateProperties">
< props>
< prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect< /prop>
< prop key="hibernate.hbm2ddl.auto">update< /prop>
< prop key="hibernate.show_sql">true< /prop>
< /props>