1. 程式人生 > >詳細解釋Spring與Hibernate的整合原理

詳細解釋Spring與Hibernate的整合原理

首先我們來看單純的使用Hibernate時管理資料來源:
在類路徑下建立一個hibernate.cfg.xml
寫入資料來源的資訊:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">toor</property>
        <property
name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///test_hibernate_spring</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property
name="show_sql">
true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <!-- C3P0 連線池的配置 --> <property name="connection.provider_class"> org.hibernate.connection.C3P0ConnectionProvider </property
>
<property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">10</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.timeout">3600</property> <property name="hibernate.c3p0.idle_test_period">120</property> <property name="hibernate.c3p0.acquire_increment">2</property> <!--c3p0配置結束 --> <!-- session要從當前執行緒中產生--> <property name="current_session_context_class">thread</property> <mapping resource="domain/Person.hbm.xml" /> </session-factory> </hibernate-configuration>

如上是hibernate的最簡單的資料來源配置。此處不進行過多解釋。
hibernate的簡單使用:


 Configuration configuration = new Configuration().configure();

 SessionFactory  sessionFactory = configuration.buildSessionFactory();

sessionFactory = configuration.buildSessionFactory();
//從當前執行緒中(ThreadLocal)中,把session提取出來如果沒有就使用openSession()
    Session session = sessionFactory.getCurrentSession();
    //hibernate的所以操作都必須在事務中
        Transaction transaction =    session.beginTransaction();
        Person p = new Person();
        p.setName("111111111111111");
        p.setDescription("2222222222222");
        session.save(p);
        transaction.commit();

如上就是hibernate的簡單使用過程。現在我們來看Spring與和hibernate的整合:
spring與hibernate的整合目的就是為了讓 IOC 容器來管理 Hibernate 的核心介面SessionFactory以及讓 Hibernate 使用上 Spring 的宣告式事務來進行事務操作.
但在Spring整合Hibernate時。處理資料來源有兩種方法:
1)依然使用Hibernate的hibernate.cfg.xml來寫資料來源資訊,在spring配置檔案中使用DI把這個檔案注入給SessionFactory介面
2)摒棄掉hibernate.cfg.xml,而將所有的資料來源配置資訊寫在spring的配置檔案中.下面詳細介紹這兩種方法:

方法一:
hibernate的配置檔案hibernate.cfg.xml保持如上資訊不變並把hibernate.cfg.xml檔案注入給spring提供的LocalSessionFactoryBean:

<bean  id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   <!-- 匯入hibernate配置檔案-->
   <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
 </bean>      

spring中使用hibernate則不需要直接通過hinernate來完成,而是通過spring提供的HibernateTemplate類來完成

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>

spring來管理事務:

<!-- 配置事務管理器     -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>
   <!-- 事務的註解解析器 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

在程式碼中使用:
操作將由hibernateTemplate來完成

@Resource(name="hibernateTemplate")
    private HibernateTemplate hibernateTemplate;
  @Transactional
    public void savePerson(){
    Person person = new Person();
    person.setUsername("666");
    person.setPassword("6666");
    hibernateTemplate.save(person);
   }

方法二:
不需要hibernate.cfg.xml來完成Spring與hibernate的整合:
此時給類LocalSessionFactoryBean注入的不是configLocation這個檔案而是一個dateSource除此之外還注入資料庫的方言,hbm.xml檔案等資訊。至於其他的如hibernateTemplate的注入,配置事務管理器,事務的註解解析器 等於上述一摸一樣:
程式碼詳情:

<!--匯入c3p0的資訊在次xml檔案中就可以使用匯入檔案的資訊-->
   <context:property-placeholder location="classpath:c3p0DB.properties"/>
   <!-- 配置 C3P0 資料來源 -->
   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
   <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
   </bean>
   <!--注入datasource給sessionFactory以及資料庫的方言和hbm.xml-->
   <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <!-- 匯入對映檔案所在的路徑 -->
        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath:domain  <!--載入這個路徑下的所有.hbm.xml-->
                </value>
            </list>
        </property>
    <!-- Hibernate其他配置 方言 等-->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

我們看到上述程式碼中在匯入c3p0連線池資訊的時候我們使用了:

  <context:property-placeholder location="classpath:c3p0DB.properties"/>

除了這種方法還有:

  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
               <value>classpath:c3p0DB.properties</value>
        </property>
    </bean>

這兩種方法都可以完成把外部properties資料匯入進來.然後通過${key}來訪問此properties檔案中的值。

相關推薦

詳細解釋SpringHibernate整合原理

首先我們來看單純的使用Hibernate時管理資料來源: 在類路徑下建立一個hibernate.cfg.xml 寫入資料來源的資訊: <hibernate-configuration> <session-factory>

Java進階學習第二十四天(Spring框架:事務管理、SpringHibernate整合

一、事務控制 1、引入 使用者訪問 > Action > Service > Dao 如何保證: 在service中呼叫2次dao,其中一個dao執行失敗,整個操作要回滾 2、事務控制概述 ① 程式設計式事務控制:自己手動控制事務 Jdbc程式

springhibernate整合配置檔案含連線池

spring的整個配置內容,對於專案整合最好是分開 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

springhibernate整合之sessionfactory的三種方式

方式1:只加載SessionFactory   <bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propertyn

IDEA 下寫出第一個 SSH 整合框架練手專案( 一 ,Spring Hibernate 整合)

IDEA 下寫出第一個 SSH 整合框架練手專案( 一 ) 最近幾周快速的學完了 SSH 框架,因為很快,所以幾乎沒記住什麼,又抄著視訊寫了一個專案,決定自己只看原始碼的再寫一遍。 1. 新建meavn專案 首先,新建一個Meavn 專案,File <---

SpringHibernate整合的相關問題和解決方案(整合方案一:dataSource交給Spring來管理)

整合的關鍵點:Hibernate的SessionFactory物件交給Spring去建立;Hibernate的事務交給Spring的宣告式事務管理;(Hibernate的操作是基於事務的操作);整合步驟:  配置資料來源(採用C3P0連線池)<bean id="data

詳細分析springstruts2的整合原理

spring與struts2如何整合: 1). 整合目標 ? 使 IOC 容器來管理 Struts2 的 Action! 2). 如何進行整合 ? 1. 正常匯入入 Struts2與spring包之後 還需要一個額外的包: st

ssh整合思想 SpringHibernate整合 項目在服務器啟動則自動創建數據庫表

dtd 啟動 mysql5 建立 color 思想 bean .hbm.xml lte Spring整合Hibernate Spring的Web項目中,web.xml文件會自動加載,以出現歡迎首頁。也可以在這個文件中對Spring的配置文件進行監聽,自啟動配置文件, 以及之

ssh整合思想 SpringHibernate和Struts2的action整合 調用action添加數據庫 使用HibernateTemplate的save(entity)方法

all 自動 註意 pool 監聽 聲明屬性 struts2 技術 utf-8 自動調用Spring的bean.xml配置文件 需要web.xml啟動文件 代碼如下: <?xml version="1.0" encoding="UTF-8"?> <web

springhibernate 的整合

    spring與hibernate的整合     hibernate的所有初始化資訊都是建立在配置檔案中的。如: Configuration ---> SessionFactory ---> Session . 那麼,我們在spring中,就只用直接去操作sessionFactory所

SpringHibernate整合

1.管理SessionFactory 使用Spring整合Hibernate時我們不需要hibernate.cfg.xml檔案。首先,在applicationContext.xml中配置資料來源(dataSource)bean和session工廠(sessionFacto

SpringStruts2整合的執行原理.

TomCat 啟動 –>載入web.xml檔案; 在web.xml檔案中 配置了Spring的監聽器,這個實現的是ServletContextListener介面,那麼當Web容器啟動的時候,這個監聽器就會執行. <listener>

將osworkflowspringhibernate整合的基本介紹

1. 將osworkflow與spring和hibernate結合的原因     1)簡化對osworkflow的配置     2)利用hibernate框架的一些特性,如持久化,快取等     3)事務管理,osworkflow本身是不支援事務的,而事務是作為一個

SpringMybatis整合

base package div classpath conf data pac 是否 ner 一 概述 1.整合的目的 將Mapper映射器的創建任務交給Spring容器。 二 具體實現 1.創建sqlSessionFactory: <bean id="sql

springstruts2整合出現錯誤HTTP Status 500 - Unable to instantiate Action

alt 問題 blog src nbsp 文件 spa XML color 在進行spring和struts2整合的時候因為大意遇到了一個問題,費了半天神終於找到了問題所在,故分享出來望廣大博友引以為戒!! 我們都知道在spring和struts2整合時,spring接管了

springquartz整合實現分布式動態創建,刪除,改變執行時間定時任務(mysql數據庫)

ces value 我們 job clu xsd collect 註解 common 背景:因為在項目中用到了定時任務,當時想到了spring的quartz,寫完發現費了很大功夫,光是整合就花了一上午,其中最大的問題就是版本問題,項目中用的是spring3.2.8的版本,查

springmybati整合方法

interface start face mapper con tro p s org lose (1)spring配置文件: <!-- 引入jdbc配置文件 --> <context:property-placeholder lo

Spring+SpringMVC+hibernate整合開發

exp mvc margin tar e30 fio ilb fc14 h264 被瘟謎謫逼戲溫次蔡蒙磊疤回http://shequ.docin.com/vpe32249 空私錘氖園掠覆痔瓜傅殖http://jz.docin.com/gqsn83067 境噬栽品新嗚趙德

SSM整合(2): spring mybatis 整合

分享 eth point names space json cal 返回 autowired 在進行完spring與springmvc整合之後, 繼續 spring與mybatis的整合. 既然是操作數據庫, 那必然不能缺少了連接屬性 一. db.properties j

Question20180104 對比編譯器、解釋Javac編譯原理

即時編譯 inf ali pro 友好 pre 目標 缺點 java、 編譯器與Javac編譯原理   在前文我們知道了Java是一種編譯語言和解釋語言,它的源代碼經過編譯器Javac編譯為能夠被JVM識別的二進制語言,然後JVM將其解釋為能夠被平臺識別的機器語言。那麽什