我們可以簡單地將hibernate應(yīng)用程序與spring應(yīng)用程序集成。
在hibernate框架中,我們提供了所有功能數(shù)據(jù)庫信息hibernate.cfg.xml文件。
但是,如果我們要將hibernate應(yīng)用程序與spring集成在一起,則無需創(chuàng)建hibernate.cfg.xml文件。我們可以在applicationContext.xml文件中提供所有信息。
Spring框架提供了 HibernateTemplate 類,因此您無需執(zhí)行太多步驟,例如創(chuàng)建Configuration,BuildSessionFactory,Session,開始和提交事務(wù)等。
因此 它節(jié)省了大量代碼。
不使用spring的理解問題:
下面的休眠代碼讓我們理解它:
//創(chuàng)建配置 Configuration cfg=new Configuration(); cfg.configure("hibernate.cfg.xml"); //創(chuàng)建seession factory對象 SessionFactory factory=cfg.buildSessionFactory(); //創(chuàng)建 session object Session session=factory.openSession(); //創(chuàng)建 transaction object Transaction t=session.beginTransaction(); Employee e1=new Employee(111,"arun",40000); session.persist(e1);//persisting the object t.commit();//事務(wù)提交 session.close();
正如您在唯一的hibernate代碼中所看到的,您必須遵循許多步驟。
使用Spring Framework的HibernateTemplate類的解決方案:
現(xiàn)在,您無需執(zhí)行太多步驟。您可以簡單地這樣寫:
Employee e1=new Employee(111,"arun",40000); hibernateTemplate.save(e1);
我們來看看HibernateTemplate類的常用方法列表。
方法 | 說明 |
void persist(Object entity) | 堅(jiān)持給定的對象。 |
Serializable save(Object entity) | 保留給定對象并返回ID。 |
void saveOrUpdate(Object entity) | 持久或更新給定的對象。如果找到id,它將更新記錄,否則保存記錄。 |
void update(Object entity) | 更新給定的對象。 |
void delete(Object entity) | 根據(jù)id刪除給定的對象。 |
Object get(Class entityClass, Serializable id) | 根據(jù)給定的id返回持久對象。 |
Object load(Class entityClass, Serializable id) | 根據(jù)給定的id返回持久對象。 |
List loadAll(Class entityClass) | 返回所有持久對象。 |
讓我們看看休眠和彈簧集成的簡單步驟是什么:
在數(shù)據(jù)庫中創(chuàng)建表。這是可選的。 創(chuàng)建applicationContext.xml文件。其中包含DataSource,SessionFactory等的信息。 創(chuàng)建Employee.java文件。這是持久性類 創(chuàng)建employee.hbm.xml文件。它是映射文件。 創(chuàng)建EmployeeDao.java文件。它是使用HibernateTemplate的dao類。 創(chuàng)建InsertTest.java文件。它將調(diào)用EmployeeDao類的方法。
在此示例中,我們將把hibernate應(yīng)用程序與spring集成。讓我們看看spring和hibernate示例的 目錄結(jié)構(gòu)。
1、在數(shù)據(jù)庫中創(chuàng)建表
在此示例中,我們使用Oracle作為數(shù)據(jù)庫,但是您可以使用任何數(shù)據(jù)庫。讓我們在oracle數(shù)據(jù)庫中創(chuàng)建表
CREATE TABLE "EMP558" ( "ID" NUMBER(10,0) NOT null ENABLE, "NAME" VARCHAR2(255 CHAR), "SALARY" float(126), PRIMARY KEY ("ID") ENABLE ) /
2、Employee.java
這是一個(gè)簡單的POJO類。在這里,它用作休眠的持久類。
package com.nhooo; public class Employee { private int id; private String name; private float salary; //getters and setters }
3、employee.hbm.xml
此映射文件包含持久類的所有信息。
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.nhooo.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
這是一個(gè)使用 HibernateTemplate 類方法來持久保存Employee類對象的Java類。
package com.nhooo; import org.springframework.orm.hibernate3.HibernateTemplate; import java.util.*; public class EmployeeDao { HibernateTemplate template; public void setTemplate(HibernateTemplate template) { this.template = template; } //保存職員的方法 public void saveEmployee(Employee e){ template.save(e); } //更新員工的方法 public void updateEmployee(Employee e){ template.update(e); } //刪除職員的方法 public void deleteEmployee(Employee e){ template.delete(e); } //方法返回一個(gè)具有給定 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 對象中提供數(shù)據(jù)庫的所有信息。該對象用于 LocalSessionFactoryBean 類對象,其中包含一些其他信息,例如mappingResources和hibernateProperties。 LocalSessionFactoryBean 類的對象在HibernateTemplate類中使用。讓我們看一下applicationContext.xml文件的代碼。
文件: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 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.nhooo.EmployeeDao"> <property name="template" ref="template"></property> </bean> </beans>
6、InsertTest.java
此類使用EmployeeDao類對象,并通過傳遞Employee類的對象來調(diào)用其saveEmployee方法。
package com.nhooo; 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); } }
現(xiàn)在,如果您在oracle數(shù)據(jù)庫中看到該表,則記錄已成功插入。
您可以在applicationContext.xml文件中啟用hibernate屬性,例如通過hbm2ddl.auto等進(jìn)行自動(dòng)表創(chuàng)建。讓我們看一下代碼:
<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>
如果編寫此代碼,則無需創(chuàng)建表,因?yàn)閷⒆詣?dòng)創(chuàng)建表。