Spring的ORM模块(结合Hibernate)

概述

Spring的ORM模块对Hibernate、iBatis、JDO等ORM框架提供支持。

ORM模块依赖于dom4j-1.6.jar和antlr.jar,需要自己添加两个类库。

本篇文章以结合Hibernate为例。

在Spring中Hibernate只是一个Bean

在Spring中,Hibernate的资源要交给Spring来管理。Hibernate和SessionFactory等只是Spring中的一个特殊的Bean,由Spring负责实例化与销毁。

这意味着我们不需要自己手动的去开启和关闭一个Session或Transaction,这些工作将由Spring自动帮我们完成。

协助我们的HibernateDaoSupport类

这是Spring为我们提供的一个方便我们进行一些DAO操作的类,我们只需要在自己的相应的Dao类中继承这个类就可以了。

常用的方法

getHibernateTemplate(),获取一个模板实例
这个实例为我们提供了一些常用的方法,比如:
persist(Object obj);用于保存一个对象
find(String HQL);用于查询


当然我们可以获取到一个session对象
getSession(),获取一个Session,调用Hibernate的API进行操作。

在Spring中配置Hibernate

在Hibernate中我们会有自己的配置文件,而在Spring中我们可以将Hibernate配置在Spring中。

配置实例

1. 配置Hibernate数据库连接属性文件

dataSource.password=admin
dataSource.username=root
dataSource.databaseName=db_test
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.dialect=org.hibernate.dialect.MySQL5Dialect
dataSource.serverName=localhost:3306
#dataSource.url=jdbc:mysql://localhost:3306/sunsheen?useUnicode=true&characterEncoding=utf-8
dataSource.url=jdbc:mysql://localhost:3306/sunsheen?useUnicode=true&characterEncoding=utf-8
dataSource.properties=user=${dataSource.username};databaseName=${dataSource.databaseName};serverName=${dataSource.serverName};password=${dataSource.password}
dataSource.hbm2ddl.auto=update

2. 配置Spring的applicationContext.xml

<context:annotation-config />
    <context:component-scan base-package="com.lidengju" />  <!-- 扫描包下的所有注解 -->

    <context:property-placeholder location="classpath:/hibernate.properties" /> <!-- 读取属性配置文件 -->

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${dataSource.dialect}</prop>
                <prop key="hibernate.hbm2ddl.auto">${dataSource.hbm2ddl.auto}</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <property name="packagesToScan">
            <list>
                <value>cn.sunsheen.entity</value><!-- 扫描实体类 -->
            </list>
       </property>
    </bean>

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>

<!-- 配置数据库信息 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${dataSource.driverClassName}" />
        <property name="url" value="${dataSource.url}" />
        <property name="username" value="${dataSource.username}" />
        <property name="password" value="${dataSource.password}" />
    </bean>
    <!-- Dao的实现 在applicationContext.xml中注入-->
    <bean id="userDao" class="com.lidengju.dao.UserDaoImpl">  
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />
    <tx:annotation-driven mode="aspectj"/>

    <aop:aspectj-autoproxy/>

3. 一般结构

在使用Spring+Hibernate时,我们通常的做法是在DAO层上再添加一个Service层,然后把事务配置在Service层上。

Service层我们用@Service注解。

Q:为什么分层?
A:分层的一般做法是:程序调用Service层,Service调用DAO层,DAO层调用Hibernate实现数据读取,原则上不允许跨层访问。分层使得业务层次更加的清晰。

Spring管理Hibernate事务

将使用XML和注解的两种方式

注解方式

配置文件中的内容

    <bean id="userDao"
        class="com.lidengju.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />
    <tx:annotation-driven mode="aspectj"/>

在使用事务的方法或类前面加上@Transactional注解

XML配置

    <bean id="userDao"
        class="com.lidengju.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

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

    <bean id="transactionAttributeSource"
        class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
        <property name="properties">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

    <bean id="userService"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager"
            ref="transactionManager">
        </property>
        <property name="target">
            <bean
                class="com.lidengju.spring.service.UserServiceImpl">
                <property name="userDao" ref="userDao"></property>
            </bean>
        </property>
        <property name="transactionAttributeSource"
            ref="transactionAttributeSource">
        </property>
    </bean>

总结

  • 我们通常会使用多层级结构,使得业务层次更加清晰。
  • 我们会把Dao配置在Spring的配置文件中,在Service层使用@Service注解,并且使用@Autowired注解属性Dao,并且把需要进行事务处理的方法用@Transactional注解
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页