我们可以轻松地将Hibernate应用程序与Spring应用程序集成。

在Hibernate框架中,我们在hibernate.cfg.xml文件中提供所有的数据库信息。

但如果我们要将Hibernate应用程序与Spring集成,我们不需要创建hibernate.cfg.xml文件。我们可以在applicationContext.xml文件中提供所有信息。

使用Spring框架与Hibernate的优势

Spring框架提供了HibernateTemplate类,因此你不需要遵循许多步骤,如创建Configuration,构建SessionFactory,Session,开始和提交事务等。

因此,它节省了大量代码

不使用Spring时的问题:

让我们通过下面的Hibernate代码来理解这个问题:

//创建配置对象
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");

//创建SessionFactory对象
SessionFactory factory = cfg.buildSessionFactory();

//创建Session对象
Session session = factory.openSession();

//创建Transaction对象
Transaction t = session.beginTransaction();

Employee e1 = new Employee(111, "arun", 40000);
session.persist(e1); //持久化对象

t.commit(); //事务提交
session.close();

如你所见,在仅使用Hibernate的代码中,你必须遵循许多步骤。

使用Spring框架的HibernateTemplate类的解决方案:

现在,你不需要遵循许多步骤。你可以简单地写:

Employee e1 = new Employee(111, "arun", 40000);
hibernateTemplate.save(e1);

HibernateTemplate类的方法

让我们看一下HibernateTemplate类的一些常用方法列表。

No.方法描述
1)void persist(Object entity)持久化给定的对象。
2)Serializable save(Object entity)持久化给定的对象并返回ID。
3)void saveOrUpdate(Object entity)持久化或更新给定的对象。如果找到ID,则更新记录,否则保存记录。
4)void update(Object entity)更新给定的对象。
5)void delete(Object entity)根据ID删除给定的对象。
6)Object get(Class entityClass, Serializable id)根据给定的ID返回持久化对象。
7)Object load(Class entityClass, Serializable id)根据给定的ID返回持久化对象。
8)List loadAll(Class entityClass)返回所有持久化对象。

步骤

让我们看看Hibernate和Spring集成的简单步骤:

  1. 在数据库中创建表 这是可选的。
  2. 创建applicationContext.xml文件 它包含DataSource、SessionFactory等的信息。
  3. 创建Employee.java文件 这是持久类。
  4. 创建employee.hbm.xml文件 这是映射文件。
  5. 创建EmployeeDao.java文件 它是使用HibernateTemplate的DAO类。
  6. 创建InsertTest.java文件 它调用EmployeeDao类的方法。

Hibernate和Spring集成的示例

在这个示例中,我们将集成Hibernate应用程序与Spring。让我们看看Spring和Hibernate示例的目录结构

7-1.png

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类。在这里它作为Hibernate的持久类。

package cn.javatiku;

public class Employee {
  private int id;
  private String name;
  private float salary;

  // getters and setters
  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 float getSalary() {
    return salary;
  }
  public void setSalary(float salary) {
    this.salary = salary;
  }
}

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="cn.javatiku.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

这是一个使用HibernateTemplate类方法来持久化Employee类对象的Java类。

package cn.javatiku;

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和hibernateProperties。LocalSessionFactoryBean类的对象被用于HibernateTemplate类中。让我们看一下applicationContext.xml文件的代码。

7-2.png

文件: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="cn.javatiku.EmployeeDao">
    <property name="template" ref="template"></property>
  </bean>
</beans>

6) InsertTest.java

这个类使用EmployeeDao类对象,并通过传递Employee类对象调用其saveEmployee方法。

package cn.javatiku;

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查询等

你可以在applicationContext.xml文件中启用许多Hibernate属性,如通过hbm2ddl.auto进行自动表创建等。让我们看一下代码:

<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>

如果你编写这段代码,你不需要创建表,因为表会自动创建。

标签: Hibernate, Hibernate教程, Hibernate框架, Hibernate框架设计, Hibernate初级教程, Hibernate框架用法, Hibernate指南, Hibernate入门, Hibernate中级教程, Hibernate进阶教程, Hibernate高级教程, Hibernate下载