开发者社区> 问答> 正文

hibernate和spring怎么整合的

hibernate和spring添加切面配置是如何搞得,请各位大神指点我,谢谢啦

展开
收起
云栖技术 2016-06-02 15:35:41 2233 0
1 条回答
写回答
取消 提交回答
  • 社区爱好者,专为云栖社区服务!

    Spring整合Hibernate是一个比较大的问题,根据我的理解,概括来说有以下步骤:
    1.Spring声明DataSource数据源的SpringBean实例;
    2.Spring声明Hibernate的SessionFactory,Spring中有对Hibernate的SessionFactory类的封装类,通常只需要声明Spring中的Hibernate封装类即可,然后利用Spring容器的依赖注入,把数据源(dataSource)注入给同样是Spring Bean实例的SessionFactory对象,同时列出所有的持久化(PO)类。
    3.把SessionFactory对象再注入给Dao方法,在Dao方法中利用SessionFactory实例对数据进行CRUD;
    4.Dao类一般仅用于单一的CRUD,真正的业务逻辑实现通常被定义在Service类中,Dao类的实例通过Spring依赖注入被注入给Service类实例;
    5.在真正的企业应用中,利用Spring对Hibernate进行事务管理也是十分重要的,而事务管理通常是利用Spring的面向切面编程(AOP)对Service类进行增强从而达到事务控制的目的。
    以下是一个配置文件示例,我假定楼主已经有了Spring和Hibernate的基础:

    <?xml version="1.0" encoding="GBK"?>
    
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    
    <!--定义数据源bean,使用C3P0数据源实现,并注入数据源的必要信息-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close"
          p:driverClass="oracle.jdbc.OracleDriver"
          p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:orcl"
          p:user="scott"
          p:password="tiger"
          p:maxPoolSize="5"
          p:minPoolSize="2"
          p:initialPoolSize="2"
          p:maxIdleTime="30"/>
    
    <!--定义Hibernate的SessionFactory,SessionFactory需要依赖注入源,注入dataSource-->
    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
          p:dataSource-ref="dataSource">
        <!-- 指定持久化(PO)类-->
        <property name="annotatedClasses">
            <list>
                <value>org.hrsystem.domain.Aoo</value>
            </list>
        </property>
        <!-- 指定Hibernate的属性配置-->
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
                hibernate.hbm2ddl.auto=update
                hibernate.show_sql=true
                hibernate.format_sql=false
                hibernate.cache.use_second_level_cache=true
                hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
            </value>
        </property>
    </bean>
    
    
    <!--把sessionFactory注入给employeeDao Bean实例-->
    <bean id="employeeDao" class="org.hrsystem.dao.impl.EmployeeDaoImpl"
          p:sessionFactory-ref="sessionFactory"/>
    
    <!--把employeeDao注入给empManager Bean实例-->
    <bean id="empManager" class="org.hrsystem.service.impl.EmpManagerImpl" p:employeeDao-ref="employeeDao"/>
    
    
    <!--
    以下是利用Spring的AOP对Hibernate进行事务控制
     -->
    <!-- 配置Hibernate的声明事务管理器,并依赖注入SessionFactory -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!-- 配置事务增强Bean,依赖注入事务管理器 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 配置详细的事务定义,这些配置放在tx:attributes元素中 -->
        <tx:attributes>
            <!-- 定义对可以作为AOP切入点的所有方法都进行事务增强
             name属性指定AOP切入点中需要进行事务增强的方法,
             用*(通配符)指代所有方法,或get*指代所有以get开头的方法;
             isolation属性指定隔离级别,用默认的隔离级别;
             propagation属性指定事务的传播性,REQUIRED指如果调用该方法的线程处于事务中,
             则直接调用;如果当前执行线程不处于事务环境中,则启动新的事务后执行该方法;
             timeout事务超时的时间,以秒为单位;
             -->
            <tx:method name="*" isolation="DEFAULT"
                       propagation="REQUIRED" timeout="5"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <!-- 定义切入点,此时仅仅指定empManager实例作为需要增强的实例,
        也可以使用Spring EL表达式来指定具有相同特征的一批类作为切入点 -->
        <aop:pointcut id="myPoint"
                      expression="bean(empManager)"/>
        <!-- 使用aop:advisor元素指定在myPoint切入点使用txAdvice进行事务增强处理 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="myPoint"/>
    </aop:config>
    2019-07-17 19:25:03
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Java Spring Boot开发实战系列课程【第6讲】:Spring Boot 2.0实战MyBatis与优化(Java面试题) 立即下载
Spring Boot 2.5开发实战 立即下载
Java Spring Boot开发实战系列课程【第15讲】:Spring Boot 2.0 API与Spring REST Docs实战 立即下载

相关实验场景

更多