Spring的ORM模块(结合Hibernate)

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的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注解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36121.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注