`
lygle
  • 浏览: 22234 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring几种Dao支持配置

阅读更多

 事务的处理一般来说有两种方式:

  一个是依赖特定的资源的事务:如通过JDBC,JTA,Hibernate Transaction。

  还有一个就是依赖窗口的参数进行事务管理,像EJB容器事务

 

spring对于以上两种都有相应的实现,还提供了一些辅助类可供我们选择使用,如基于JDBC,JDO,HIBERNATE的扩展类.而对于依赖容器的参数化事务管理来说,spring体现出一它的优势,它本身也是一个容器,但相对EJB容器它来它显得很轻巧(当然在后来插件越来越多的情况下,我们需要摈弃一些我们不用的模块)。我们不用付出其他的代价,就可以通过spring实现容器的事务管理。

下面就来说说基于JDBC,HIBERNATE这两种方式的事务管理与非事务管理的配置:

 

 

取得source连接

首先对于一个DB操作,我们必须要取得DB连接,而在spring下取得这个连接的方式可以采用

1.JNDI

2.配置dataSource(spring方式)或者sessionFactory(hibernate)

且看下面代码:

对于JNDI可以参考如下实现:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
		<value>jdbc_sdcf</value>
		</property>
		</bean>  
		</beans>

 

对于dataSource方式如下:

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>oracle.jdbc.driver.OracleDriver</value>
		</property>
		<property name="url">
			<value>jdbc:oracle:thin:@127.0.0.1:1521:oracle</value>
		</property>
		<property name="username">
			<value>test</value>
		</property>
		<property name="password">
			<value>test</value>
		</property>
		<property name="connectionProperties">
			<props />
		</property>
	</bean>

 

而对于sessionFactory的方式来说, 我们可以有两种方式来配置它:

一个是基于在spring的dataSource方式上进行配置:

<bean id="sessionFactory" class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	 	<property name="dataSource">
	 		<ref local="dataSource"/>
	 	</property>
	 	<property name="mappingResources">
	 		<list>
	 			<value>com/lgh/hibernate/UserTable.hbm.xml</value>
	 		</list>
	 	</property>
	 	<property name="hibernateProperties">
	 		<props>
	 		    <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 
	 			<prop key="hibernate.show_sql">true</prop>
	 		</props>
	 	</property>
	</bean> 

 

而另一个方式就是在hibernate.hbm.xml方式上进行配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />  
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    </bean> 

 

这个hibernate.cfg.xml方式可以利用myeclipseIDE导入hibernate功能时自动创建,如下例子:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

	<session-factory>
		<property name="dialect">
			org.hibernate.dialect.OracleDialect
		</property>
		<property name="connection.url">
			jdbc:oracle:thin:@localhost:1521:oracle
		</property>
		<property name="connection.username">test</property>
		<property name="connection.password">test</property>
		<property name="connection.driver_class">
			oracle.jdbc.driver.OracleDriver
		</property>
		<property name="myeclipse.connection.profile">
			local_oracle
		</property>
		<!-- 事务管理类型,这里我们使用JDBC Transaction

		<property name="hibernate.transaction.factory_class">net.sf.hibernate.transaction.JDBCTransactionFactory
		</property> -->
		<mapping resource="com/lgh/hibernate/UserTable.hbm.xml" />

	</session-factory>

</hibernate-configuration>

 

 

 

事务管理(transactionManager)的两种初始化方式:

一种是根据dataSource来初始化我们的事务管理器,另一种则是根据sessionFactory(hibernate方式)来初始化我们的事务管理器:

 

<!-- 事务方式方式一--> 
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref local = "dataSource"/>
		</property>
	</bean> 
	<!-- 事务配置方式二 -->
	<bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean> 

 

 

 

 

 

JDBC在spring下的事务与非事务方式

 

1.非事务处理方式

     jdbc在spring下的非事务方式很简单,它其实就是于JDBC的简单封装:

 

public interface JdbcDao {
 public void insert(String[] sql);
}

public class JdbcDaoImpl extends JdbcDaoSupport implements JdbcDao {

	public void insert(String[] sql) {
		for (String s : sql)
			getJdbcTemplate().execute(s);
	}
}

 

 

这是简单的SQL语句插入,对于配置文件,我们只需要配置一个dataSource跟如下的bean:

	<bean id="jdbcDao" class="com.lgh.spring.jdbc.JdbcDaoImpl">
		<property name="dataSource">
			<ref local="dataSource"/>
		</property>
	</bean>

 

这种方式的缺点就是它是非事务处理方,即如果后面的数据处理错误时,而这时候如果前面已经进入数据操作了,它将无法回滚。

 

2.事务处理方式

   顾名思义,这种方式是可以回滚前面所做的事情的。它的参数化配置如下:

	<bean id="jdbcDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
	 	<property name="proxyTargetClass">
        	  <value>true</value>
        </property> 
	 	<property name="transactionManager">
			<ref local="transactionManager"/>
		</property>
		<property name="target">
			<ref local="jdbcDao"/>
		</property>
		<property name="transactionAttributes">
			<props>
				<prop key="insert*">PROPAGATION_REQUIRED</prop>
				<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
			</props>
		</property>
	</bean>

 

如果我们想默认对所有的事件进行事务处理我们可以不用配置transactionAttributes

 

 

Hibernate在spring下的事务与非事务处理方式:

 

  非事务处理方式很简单:

 

	 <bean id = "hiberDao" class = "com.lgh.spring.hibernate.HiberDaoImpl">
		<property name="sessionFactory">
			<ref local = "sessionFactory"/>
		</property>
	</bean> 

 

而对于事务处理方式的参数化配置:

<bean id = "hiberDaoProxy" class = "com.lgh.spring.hibernate.HiberDaoImpl">
		<property name="sessionFactory">
			<ref local = "sessionFactory"/>
		</property>
	</bean> 
    <bean id="hiberDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
        <property name="transactionManager" ref="transactionManager" />     
        <property name="target" ref="hiberDaoProxy" />  
         <property name="proxyInterfaces" value="com.lgh.spring.hibernate.HiberDao" />
        <property name="transactionAttributes">  
            <props>  
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>  
        </property>  
    </bean>  

 

 

 

总:

   对于项目开发中,实际上经常会碰到spring与hibernate一起结合来进行参数化配置,但很多时候我们总是会分不清到底是哪个跟哪个。但其实我们只要掌握了,事务参数化配置的原理。如如何取得sessionFactory,它有几种方式。是否要引用datasource来建立,及事务管理器的各种参数化配置方式等等,总之,只要明白的其中的原理就不难解决配置上的这块问题了。

 

 

 

 

分享到:
评论
4 楼 jidilangzi603 2010-03-17  
楼主总结的非常好,我一直都对hibernate与spring的事物管理和数据库配置一知半解,幸得楼主分析到位,非常感谢!
3 楼 xiangdefei 2010-03-16  
嘿嘿,学习,楼主总结得很好哦,3Q
2 楼 lygle 2010-03-16  
lyltiger 写道
JDBC在spring下的事务与非事务方式中的 非事务中可以稍作改造

在 java code 中 在执行之前先将 链接关闭,当正常通过后,再一并进行commit,否则rollback。

呵呵,这种就是采用这种原始的事务提交方式了
1 楼 lyltiger 2010-03-16  
JDBC在spring下的事务与非事务方式中的 非事务中可以稍作改造

在 java code 中 在执行之前先将 链接关闭,当正常通过后,再一并进行commit,否则rollback。

相关推荐

    Spring面试题含答案.pdf

    25. 解释 Spring 支持的几种 bean 的作用域 26. Spring 框架中的单例 bean 是线程安全的吗? 27. 解释 Spring 框架中 bean 的生命周期 28. 哪些是重要的 bean 生命周期方法? 你能重载它们吗? 29. 什么是 Spring ...

    Spring面试专题.md

    常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置. 主要由以下几个模块组成: * Spring Core:核心类库,提供IOC服务; * Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI...

    Spring in Action(第2版)中文版

    5.3.3使用spring对jdbc的dao支持类 5.4在spring里集成hibernate 5.4.1选择hibernate的版本 5.4.2使用hibernate模板 5.4.3建立基于hibernate的dao 5.4.4使用hibernate3上下文会话 5.5spring和java持久api ...

    Spring in Action(第二版 中文高清版).part2

    5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java...

    Spring in Action(第二版 中文高清版).part1

    5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java...

    springmybatis

    下面对这几个配置文件解释下: 1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 ...

    ssh(structs,spring,hibernate)框架中的上传下载

    --DAO配置 //--> 32. <bean id="tfileDAO" class="sshfile.dao.TfileDAOHibernate"> 33. 34. 35. … 36. </beans>  第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了...

    基本于J2EE的Ajax宝典.rar

    18.3 处理类的几种形式 60 18.3.1 使用普通Servlet 生成响应 60 18.3.2 使用 AjaxXmlBuilder 辅助类 62 18.3.3 使用 BaseAjaxAction 生成响应 66 18.3.4 使用 BaseAjaxServlet 生成响应 68 18.3.5 使用非 Java...

    支持多数据库的ORM框架ef-orm.zip

    事实上JPA的几种数据查询方式存在青黄不接的问题。选择查询语言xxQL,项目面临后续维护困难,跨数据库移植性差;选择Criteria API,代码臃肿,操作繁琐,很多人望而却步。EF的设计思想是使人早日摆脱拼装SQL/HQL/...

    DBKING使用指南

     异构数据库的导入导出一直是个大难题,一般的工具配置复杂,尤其是不支持LOB这样的大字段数据,我们的这个工具不仅配置简单,而且具有以下几个特点。  1、速度非常快,这个因为取决于系统环境,这个只有谁用...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    java面试题

    多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized。 c#中的委托,事件是不是委托? 答:委托就是将方法作为一个参数...

    Java面试宝典2010版

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 47、sleep() 和 wait() 有什么区别? 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 ...

    最新Java面试宝典pdf版

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    Java面试笔试资料大全

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    JAVA面试宝典2010

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    Java面试宝典-经典

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

Global site tag (gtag.js) - Google Analytics