spring和hibernate的集成

        spring:主jar,兩個日誌包,aop,cglib,juit包       
        spring可以替hibernate生成session工廠:

        <bean id="sessionFactory"  class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">//先創建session工廠的代理對象

           <property name="configLocation">

                 <value>classpath:hibernate.cfg.xml</value>

           </property>

        </bean>

       <!--配置事務管理器

     <bean id ="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">(也可說是事務管理器)

        <property name=""sessionFactory" ref bean="sessionFactory">//通過注入工廠,來生成一個全局性的事務(事務是工廠生成的)

     </bean>

           

    <!--事務的傳播特性-->//給某些方法增加一個全局性的事務,如add,deteler,modify,

   <tx:advice id="txAdvice"  transaction-manager="transactionManager">

           <tx:attributes>         

                 <tx:method name="add*" propagation="REQUWED"/>

                 <tx:method name="del*" propagation="REQUERD"/>

                 <tx:method name="modify*" propagation="REQUERD"/>

                  <tx:method name="*"  read-only="true" />

           </tx:attributes>

   </tx:advice>

//哪些類的哪些方法需要用到事務

  <aop:config>//不需要配置切面,   
      <aop:pointcut id="allManagerMethod" expression="execution(* com.manager.*.*(..))">//給包下所有類的所有方法增加事務的傳播特性

      <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice">//只有符合point-cut-ref下包的類的方法纔會給增刪改方法織入事務。

  </aop:config>

        利用面向切面的方式,給業務層的實現類創建代理對象,如userManager,logManager,在創建的時候不是對象本身,都是代理對象,當調用代理對象的增刪改方法時,會調用切面的invoke方法,並在執行增刪改方法之前織入advice(這個advice就是事務的傳播特性,但會判斷是否存在事務運行),然後創建一個全局性的事務。當執行另外一個業務的增刪改方法時,若有一個全局性的事務,便不會創建事務,會利用之前的全局性的事務。不同線程也會共享一個事務。 注:此時的同步會放在事務上,這樣就把安全級別降到事務上,實現了安全性和效率性的統一。在ThreadLocalMap中不會進行同步,這樣也提高的效率。

        由於加載數據不用事務,所以在業務層中不會對session進行關閉,爲了不造成懶加載異常,通過懶加載過濾器去關閉session。(spring自動提供了一個懶加載的filter)

   注:配置sessionFactory的另外一種辦法:即不用讀取cfg文件,通過spring配置即可:

      <!-- 配置數據源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost/xiaobai?characterEncoding=utf8"></property>
        <property name="username" value="root"></property>
        <property name="password" value="102627"></property>
    </bean>

    <!-- 配置SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.connection.characterEncoding">utf8</prop>
            </props>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>fgb.entity.user.User</value>
                <value>fgb.entity.article.Article</value>
                <value>fgb.entity.article.Comment</value>
                <value>fgb.entity.article.ArticleClick</value>
                <value>fgb.entity.album.Album</value>
                <value>fgb.entity.album.Photo</value>
                <value>fgb.entity.video.VideoSet</value>
                <value>fgb.entity.video.Video</value>
                <value>fgb.entity.aboutme.AboutMe</value>
                <value>fgb.entity.noteleft.NoteLeft</value>
                <value>fgb.entity.noteleft.NoteLeftPraise</value>
                <value>fgb.entity.noteleft.NoteLeftReply</value>
                <value>fgb.entity.noteleft.NoteLeftReply2</value>
                <value>fgb.entity.music.MusicList</value>
                <value>fgb.entity.music.Music</value>
            </list>
        </property>
    </bean>
   


      

發佈了108 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章