Spring与Hibernate的整合

1. Spring与Hibernate的整合

1.1. 在Spring容器中创建SessionFactory

为了避免硬编码的资源查找与应用程序对象紧密耦合,Spring允许你在Spring容器中以bean的方式定义诸如JDBC DataSource或者Hibernate SessionFactory 的数据访问资源。任何需要进行资源访问的应用程序对象只需要持有这些事先定义好的实例的引用,下面的代码演示如何创建一个JDBC DataSource 和Hibernate SessionFactory 。

在ApplicationContext.xml文件中进行如下配置:

"dataSource" class="org.apache.commons.dbcp.BasicDataSource">

"driverClassName" value="oracle.jdbc.driver.OracleDriver">

"url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl">

"username" value="scott">

"password" value="tiger">

"sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

"dataSource">

"dataSource" />

"hibernateProperties">

"hibernate.dialect">

org.hibernate.dialect.Oracle9Dialect

"mappingResources">

com/morris/school/dao/entity/Department.hbm.xml

在应用程序中可以如下使用:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

"applicationContext.xml");

SessionFactory sessionFactory = (SessionFactory) applicationContext

.getBean("sessionFactory");

1.2. 基于Hibernate3的原生API实现DAO

DepartmentDapImpl.java

package com.morris.school.dao.jdbc;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.classic.Session;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.morris.school.dao.IDepartmentDao;

import com.morris.school.dao.entity.Department;

public class DepartmentDapImpl implements IDepartmentDao {

private SessionFactory sessionFactory;

public SessionFactory getSessionFactory() {

return sessionFactory;

}

public void setSessionFactory(SessionFactory sessionFactory) {

this.sessionFactory = sessionFactory;

}

public void addDepartment(Department dept) {

Session session = sessionFactory.openSession();

Transaction transaction = null;

try {

transaction = session.beginTransaction();

session.save(dept);

transaction.commit();

} catch (Exception e) {

if (transaction != null) {

transaction.rollback();

}

e.printStackTrace();

} finally {

session.close();

}

}

}

在spring配置文件中如下配置:

1.3. 基于Spring的DAO实现

HibernateDaoSupport 基类提供了访问与当前事务绑定的 Session 对象的函数,因而能保证在这种情况下异常的正确转化。 类似的函数同样可以在 SessionFactoryUtils 类中找到,但他们以静态方法的形式出现。 值得注意的是,通常将 'false' 作为参数值(表示是否允许创建)传递给 getSession(..) 方法进行调用。 此时,整个调用将在同一个事务内完成(它的整个生命周期由事务控制,避免了关闭返回的 Session 的需要)。

package com.morris.school.dao.jdbc;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.classic.Session;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.morris.school.dao.IDepartmentDao;

import com.morris.school.dao.entity.Department;

public class DepartmentDapImpl extends HibernateDaoSupport implements IDepartmentDao {

public static void main(String[] args) {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

"applicationContext.xml");

IDepartmentDao deptDao = (IDepartmentDao) applicationContext

.getBean("deptDao");

deptDao.addDepartment(new Department("4", "后勤部"));

}

public void addDepartment(Department dept) {

this.getHibernateTemplate().save(dept);

}

}

1.4. 单个事务管理的配置

"deptDao" class="com.morris.school.dao.jdbc.DepartmentDapImpl">

"sessionFactory" ref="sessionFactory">

"transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

"sessionFactory" ref="sessionFactory">

"transactionProxy"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

"target" ref="deptDao">

"transactionManager" ref="transactionManager">

"proxyTargetClass" value="true">

"transactionAttributes">

"add*">PROPAGATION_REQUIRED

"update*">PROPAGATION_REQUIRED

"delete*">PROPAGATION_REQUIRED

"insert*">PROPAGATION_REQUIRED

"save*">PROPAGATION_REQUIRED

"do*">PROPAGATION_REQUIRED

"query*">readOnly

"find*">readOnly

"*">PROPAGATION_REQUIRED,readOnly

1.5. 公共事务的配置

"deptDao" class="com.morris.school.dao.jdbc.DepartmentDapImpl">

"sessionFactory" ref="sessionFactory">

"transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

"sessionFactory" ref="sessionFactory">

"baseTransactionProxy"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

abstract="true" lazy-init="true">

"transactionManager" ref="transactionManager">

"transactionAttributes">

"add*">PROPAGATION_REQUIRED

"update*">PROPAGATION_REQUIRED

"delete*">PROPAGATION_REQUIRED

"insert*">PROPAGATION_REQUIRED

"save*">PROPAGATION_REQUIRED

"do*">PROPAGATION_REQUIRED

"query*">readOnly

"find*">readOnly

"*">PROPAGATION_REQUIRED,readOnly

"userDaoProxy" parent="baseTransactionProxy">

"target" ref="deptDao">

你可能感兴趣的:(spring,hibernate,spring)