概述
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