spring和hibernate的集成

来源:互联网 发布:淘宝用图片找商品 编辑:程序博客网 时间:2024/05/20 21:20

        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>
   


      

0 0
原创粉丝点击