Spring与Hibernate整合小细节与测试问题

原创 2015年11月18日 08:33:20

学习SSH框架的童鞋们肯定有一个学习过程,此篇文章详述了关于Spring和Hibernater整合会遇到的一些小问题,废话不多说,接下来开始正文

首先贴出来文件目录结构:


1:Spring和Hibernate支持添加顺序

首先添加Spring支持,而后在添加Hibernate支持时,一定要将Hibernate的工具包添加入Spring configuration file中,点击下一步中勾选Existing Spring configuration file。

这两步作用则是将以往Hibernate.cfg.xml文件中的内容迁移至Spring配置文件中,完成配置文件的整合(注意文件头部可能会因为某些包未引入而产生文件找不到错误)

2:整合配合文件中配置事务:声明式事务配置

作用是使用session进行数据库操作前后,无需手动调用beginTransaction和事务提交,交由Spring管理,具体配置如下:

<!-- 声明式事务配置 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref local="sessionFactory" />
		</property>
	</bean>
<!-- AOP切面声明事务管理 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
		<!-- 支持当前事务,如果执行到save开头的任何方法时没有事务则开启一个事务-->
			<tx:method name="save*" propagation="REQUIRED" /> 
			<!-- 支持当前事务,如果执行到update开头的任何方法时没有事务则开启一个事务 -->
			<tx:method name="update*" propagation="REQUIRED" />
			<!-- 支持当前事务,如果执行到add开头的任何方法时没有事务则开启一个事务 -->	
			<tx:method name="add*" propagation="REQUIRED" />
			<!-- 支持当前事务,如果执行到delete开头的任何方法时没有事务则开启一个事务 -->
			<tx:method name="delete*" propagation="REQUIRED" />
			<!-- 支持当前事务,查询没有事务,就以非事务方式执行。只读 -->
			<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
			<!-- 支持当前事务,查询没有事务,就以非事务方式执行。只读 -->
			<tx:method name="find*" propagation="SUPPORTS" read-only="true" /> 

			<tx:method name="*" read-only="true" propagation="NOT_SUPPORTED" />
		</tx:attributes>
	</tx:advice>

3:类通过配置标签bean注册入ApplicationContext.xml

类的注册分为有无值注入两种

简单的一种无值注入,也就是类中没有需要通过xml实例对象注入到类中的:

<span style="white-space:pre">	</span><bean id="advice" class="com.aop.advice.Advice"></bean>
复杂点儿的有值注入,也就是类中有私有数据成员为其他类的对象,这时就需要通过xml实例对象然后进行注入:

<span style="white-space:pre">	</span><bean id="userDao1" class="com.hp.dao.impl.UserDaoJDBCImpl" />
	<bean id="userservice" class="com.hp.service.UserService">
		<property name="userDao" ref="userDao1" />
	</bean>
上贴代码,就是在UserService类中有一个私有数据成员:private UserDaoJDBCImpl userDao;

过程是:通过bean:userservice获取对象时,通过配置文件的属性ref指代的bean,映射到相应的类,实例一个对象,而后进行对象注入到UserService中,实例出来一个UserService对象。

需要注意的是,注入时找的注入方法:应为set+name属性首字母大写(ref属性映射的类);例如:以上例子找的方法应该为

public void setUserDao(UserDaoJDBCImpl userDao);

4:SessionFactory注入

session工厂注入点:

考虑到哪儿用到session就注入到哪个类中,可得到结果注入位置应为dao.impl,即应在每个对数据库操作的实现类中

注入方式:

1:hibernate配置整合入spring框架中时,spring配置文件中有bean建立了对SessionFactory

<span style="white-space:pre">	</span><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver">
		</property>
		<property name="url" value="jdbc:mysql://localhost:3306/shop"></property>
		<property name="username" value="sa"></property>
		<property name="password" value="123456"></property>
	</bean>
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 保证数据库连接通畅 -->
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<!-- 常规属性设置,方言(本地化处理) -->
		<property name="hibernateProperties">
			<props>
				<!-- 设置Hibernate方言 -->
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<!-- 是否打印sql -->
				<prop key="hibernate.show_sql">true</prop>
				<!-- 格式化sql -->
				<prop key="hibernate.format_sql">true</prop>
				<!-- 是否自动更新表 -->
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.current_session_context_class">thread</prop>
				<!-- 最大抓取深度,如果为0,则关闭默认的外连接抓取。建议值为0-3 -->
				<prop key="hibernate.max_fetch_depth">1</prop>
				<!-- 用于生成有助于调试的注释信息,默认为关闭 -->
				<prop key="hibernate.use_sql_comments">true</prop>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.MySQLDialect
				</prop>
			</props>
		</property>

2:仔细阅读标注3的有值注入方式,在property 标签中ref引用SessionFactory的bean id

<span style="white-space:pre">	</span><bean id="productDao" class="com.aop.dao.impl.ProductDaoImpl">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

3:在Spring框架中自带有对Session工程的管理类HibernateTemplate,所以值注入的是SessionFactory,但需要转换成HibernateTemplate进行管理

ProductDaoImpl类中添加HibernateTemplate属性及必要的注入方法:

<span style="white-space:pre">	</span>//增加hibernateTemplate属性
	private HibernateTemplate hibernateTemplate;
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.hibernateTemplate =
				new HibernateTemplate(sessionFactory);
	}
然后你就可以把hibernateTemplate当做session来进行数据库操作了,例如:

<span style="white-space:pre">	</span>public void deleteCategory(Category category) {
		hibernateTemplate.delete(category);
	}
由于前面已经讲述了在xml中配置声明式事务,所以在操作是无需手动控制事务的开启和提交

5:测试时小问题

之所以贴出来delete删除方法,是提醒各位需要注意,hibernate处理的对象分为持久态和游离态,当你创建一个匿名对象用于删除时,如果数据库其他字段设置不允许为空,而你创建的匿名对象其他字段为空时,在删除操作过程前的对象持久化,则会出现问题,切记切记


声明:以上英文字符串除了代码段是贴过来的不会出错外,其余纯手工(笔者外语学的是俄语。。。),如有出错,还望海涵
笔者也是在学习阶段,有什么说错的地方或者描述不详细的地方还望指出,一块儿学习



版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring整合Hibernate遇到的问题

1、刷新模式的问题,FlushMode.MANUALWrite operations are not allowed in read-only mode (FlushMode.MANUAL): Tur...
  • u014332200
  • u014332200
  • 2017年07月27日 18:08
  • 295

spring整合hibernate的两种方式

我们学过spring的同学都知道,spring可以整合其他的框架协同开发,大大的降低开发的时间和提高了效率,但是我们在配置的时候总会发生各种各样的问题,下面我记录一下我在配置的时候出现的问题和简单总结...
  • xujin_chen
  • xujin_chen
  • 2016年12月10日 11:37
  • 2937

详细解释Spring与Hibernate的整合原理

spring与hibernate的整合
  • canot
  • canot
  • 2016年01月13日 17:38
  • 4359

Hibernate4与Spring4整合,使用Junit4测试相关学习笔记

一、在myeclipse中创建web project 1.导入Hibernate4.1与Spring4.1的Libraries。其中myeclipse自带的spring libraries中缺少...
  • limingei
  • limingei
  • 2017年02月06日 10:22
  • 356

spring+hibernate 两种整合方式配置文件

之前的文章都是讲解springmvc+spring+mybatis 的整合,而很少有springmvc+spring+hibernate 因为工作的需要,最近在使用hibernate 所以下面我们来看...
  • QH_JAVA
  • QH_JAVA
  • 2016年07月05日 02:07
  • 14190

使用Spring整合Hibernate的小例子,内含所有jar包导入Eclipse即可运行

代码下载链接:  http://download.csdn.net/detail/u013803262/8532881 ssh框架是当前流行的主流框架,广泛的运用与JavaEE企业级应用...
  • u013803262
  • u013803262
  • 2015年03月25日 16:26
  • 1920

Spring注解整合(hibernate+mybatis) 学习笔记

Spring的注解Beans配置文件的注解对Bean文件注解; 在类上面,使用@Component(“在xml中的id”) 表示注册一个Bean@Resource private Session...
  • dartagnan_wang
  • dartagnan_wang
  • 2015年09月21日 00:07
  • 2211

使用Maven 整合Spring和hibernate 适合初级接触的学者

本文,主要介绍Spring 和 hibernate怎么去整合,废话就不多说了,如果不知道spring 和hibernate 是干嘛的,还请去问问度娘哈。下面开始一步一步搭建: 工具: Idea  ...
  • yulinlin_fei
  • yulinlin_fei
  • 2016年07月16日 17:16
  • 1965

spring整合hibernate的两种方式

spring整合hibernate 有两种方式 1、注解方式 2、xml方式实现。 两种配置方式最大的不同就是注解方式不用写O/R映射配置文件,而xml方式实现的要配置O/R的配置文件。 ...
  • Tidhy
  • Tidhy
  • 2017年05月21日 17:42
  • 251

Spring整合HIbernate时,三种数据库连接池的配置和比较

现在常用的开源数据库连接池主要有c3p0、dbcp、proxool三种,其中: Spring                         推荐使用dbcp; Hibernate    ...
  • he90227
  • he90227
  • 2014年06月30日 16:22
  • 2516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring与Hibernate整合小细节与测试问题
举报原因:
原因补充:

(最多只允许输入30个字)