spring3.2整合hibernate4.2事物管理问题求助,在线等~~~

悄悄地慢慢的 发布于 2013/01/23 20:44
阅读 4K+
收藏 1
我使用的是spring3.2与hibernate4.2整合,写了个baseDao供其他dao继承。在spring.xml配置文件中将sessionFactory注入给我的baseDao,现在的问题就是我每次增删改都得在baseDao里获取Transaction开事物提交事物,我想把事物管理提取出去改怎么在spring配置文件中写呢?求助!!!
public boolean upload(Object object) {
		// TODO Auto-generated method stub
		Session session = sessionFactory.getCurrentSession();
		Transaction tran = session.getTransaction();
		tran.begin();
		session.update(object);
		tran.commit();
		return true;
	}
加载中
0
魏俊
spring配置文件的定义:


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


<!-- 利用spring的AOP功能,即面向切面的编程,来配置事务  -->




<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="exeCall*" propagation="REQUIRED" />
            <tx:method name="search*" propagation="REQUIRED" read-only="true"  />
            <!--  只有search方法开启只读事务、exeCall方法时开启读写事务。其他方法如save,update等方法,不开启事务,由内部exeCall方法开启读写事务  -->
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut id="interceptorPointCuts"
            expression="execution(* com.manager.BaseManager.*(..))" /><!-- 此处根据baseDao来自行定义 -->
            <!-- 为interceptorPointCuts切入点应用txAdvice事务切面 -->
        <aop:advisor advice-ref="txAdvice"  pointcut-ref="interceptorPointCuts" />
    </aop:config>






----------------------------------------------------------------


baseDao中的写法:


public Object exeCall(DbCallBackManager dbCallBackManager) throws Exception {
return dbCallBackManager.doCallBack(getSession());
}




public boolean save(final Object o) {
boolean flag = true;
try {
CtxUtils.getBaseManager().exeCall(new DbCallBackManager() {
public Object doCallBack(Session session) {
session.save(o);
return null;
}
});
} catch (Exception e) {
flag = false;
e.printStackTrace();
log.error(e.getMessage(), e);
}
return flag;
}






public Object searchObject(Class clazz, long id) {
return this.getSession().get(clazz, id);
}


.....


public SessionFactory getSessionFactory() {
return sessionFactory;
}



public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}




public Session getSession() {
return this.getSessionFactory().getCurrentSession();
}




------------------------------------------------------------------


定义一个抽象接口类DbCallBackManager:


import org.hibernate.Session;




public abstract interface DbCallBackManager {
public abstract Object doCallBack(Session session);
}


------------------------------------------------------------------


以上代码是在spring3.1 hibernate4.1下亲测可用,s3.2和h4.2下未测试过.


如有不懂,请阅读Hibernate的源码:


HibernateTemplate.execute(new HibernateCallback() {});










魏俊
回复 @赵磊19881027 : 已发至你的邮箱,请查收
悄悄地慢慢的
您好~~能把spring+hibernate 整合demo给我发一份吗?邮箱373007331@qq.com 谢谢啊~
0
悄悄地慢慢的
这是spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
	http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">

	<!-- 定义数据源bean -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/watch" />
		<property name="user" value="root" />
		<property name="password" value="root" />
		<!-- 指定连接数据库连接池的最大连接 -->
		<property name="maxPoolSize" value="50" />
		<!-- 指定连接数据库连接池的最小连接 -->
		<property name="minPoolSize" value="10" />
		<!-- 指定连接数据库连接池的初始化连接数 -->
		<property name="initialPoolSize" value="10" />
		<property name="acquireIncrement" value="5" />
		<property name="numHelperThreads" value="10" />
		<property name="maxStatementsPerConnection" value="10" />
		<property name="idleConnectionTestPeriod" value="10000" />
		<property name="testConnectionOnCheckin" value="true" />
		<!-- 指定连接数据库连接池的最大空闲时间 -->
		<property name="maxIdleTime" value="28000" />
	</bean>
	<!-- 定义hibernate的sessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource"  ref="dataSource"/>
		<property name="mappingLocations" >
			<list>
				<value>classpath:/com/test/pojo/LoginLog.hbm.xml</value>
				<value>classpath:/com/test/pojo/SysRole.hbm.xml</value>
				<value>classpath:/com/test/pojo/SysUser.hbm.xml</value>
				<value>classpath:/com/test/pojo/Test.hbm.xml</value>
			</list>
		</property>  
		<property name="hibernateProperties">
			<props>  
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>  
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="hibernate.format_sql">true</prop>  
                <prop key="hibernate.jdbc.fetch_size">50</prop>  
                <prop key="hibernate.jdbc.batch_size">25</prop> 
                <!--  避免createClob() method threw error -->
                <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop> 
                <prop key="hibernate.current_session_context_class">thread</prop>
            </props>
		</property>
	</bean>
	<bean id="baseDao" class="com.test.dao.impl.BaseDaoImpl">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<bean id="baseService" class="com.test.service.impl.BaseServiceImpl">
		<property name="baseDao" ref="baseDao" />
	</bean> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean> 
	
	<import resource="classpath:config/spring-dao.xml"/>
	<import resource="classpath:config/spring-service.xml"/>
	<import resource="classpath:config/spring-action.xml"/>
</beans>
0
灰花走湿
灰花走湿
子类DAO extends support类
0
悄悄地慢慢的

能具体点吗?

我现在做法是直接在spring配置文件中将sessionFactory注入到我的baseDao了,所以其他dao继承basedao都是要begin事物commit事物。是不是不能直接注入啊~~~

有人说让我弄个切面什么的  管理事物,完全不会啊!!!

请指教~

0
魏俊
CtxUtils.getBaseManager()=同于利用spring获得你的baseDao
0
天天天
天天天
为啥你不上JPA
0
灰花走湿
灰花走湿
声明式事务管理不够灵活。
灰花走湿
灰花走湿
回复 @魏俊 : 嗯,是的,对。
魏俊
回复 @yaoyaoling : 你的这篇文章中是这种写的: ... 通常情况下,笔者强烈建议在开发中使用声明式事务,不仅因为其简单,更主要是因为这样使得纯业务代码不被污染,极大方便后期的代码维护。 和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。 ...
灰花走湿
灰花走湿
回复 @魏俊 : 魏俊您好,我这有篇文章,讲的很好,您看下吧 http://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/section4.html
魏俊
声明式事务灵不灵活无所谓,达到目的就行!
0
悄悄地慢慢的
谢谢。我试试看~
0
人月神话
人月神话
spring有3.2?
0
灰花走湿
灰花走湿

引用来自“yaoyaoling”的答案

声明式事务管理不够灵活。
嗯,呵呵,是。
返回顶部
顶部