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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章