请教关于spring事务管理的怪问题,事务没有自动提交。大哥们请帮帮忙!

wolfrx0080 2013-01-16 03:17:46
最近想要搭建一个spring和hibernate的系统,一切准备就绪,但是在测试的时候发现了个怪问题。

问题是这样的,代码可以正常运行,但是测试数据入库时发现不调用testDAO.getHibernateTemplate().getSessionFactory().close();这一句代码的话,在数据库里就查不到数据;调用这句之后就可以正常入库了。

实在是几天没搞定,想请各位大哥帮帮忙指点一下。

运行环境是:
JDK1.6
spring3.0(由myeclipse8.5自动导入的)
hibernate3.3(由myeclipse8.5自动导入的)
oracle 10g_r2

先上测试代码:

1、调用main类

package test;

import www.am8.manage.TestManageImpl;

public class SSHTest {

public static void main(String args[])
{
TestManageImpl tmi=new TestManageImpl();

tmi.shiwuSaveTest();
}
}


2、manage类

package www.am8.manage;

import java.util.Calendar;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import www.am8.iface.TestManage;
import www.am8.pojo.Test;
import www.am8.pojo.TestDAO;

public class TestManageImpl implements TestManage {

private TestDAO iTestDAO;

public TestDAO getiTestDAO() {
return iTestDAO;
}

public void setiTestDAO(TestDAO iTestDAO) {
this.iTestDAO = iTestDAO;
}

public void shiwuSaveTest() {
Resource res =new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(res);
//从BeanFactory获取UserDAO
TestDAO testDAO = (TestDAO) factory.getBean("TestDAO");

Test t = new Test();
Calendar c = Calendar.getInstance();

t.setTestId(21);
t.setShiJian(c.getTime());
t.setVar2("中文!!");
t.setChangZhengShu(23551);
t.setShiJian2("");

testDAO.save(t);
//testDAO.getHibernateTemplate().getSessionFactory().close();
}
}


3、applicationContext.xml

<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
>

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

<bean id="TestDAO" class="www.am8.pojo.TestDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="TestManageImpl" class="www.am8.manage.TestManageImpl">
<property name="iTestDAO">
<ref bean="TestDAO" />
</property>
</bean>

<bean id="spring" class="www.am8.springUtil.BeansUtil" />

<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<!--事务传播特性为required -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置那些类的方法进行事务管理,当前com.sy.crm.service包中的子包,
类中所有方法需要,还需要参考tx:advice的设置 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* www.am8.manage.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
</aop:config>
</beans>
...全文
1798 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cn_hhaip 2015-01-27
  • 打赏
  • 举报
回复
将sessionFactory.openSession();改为sessionFactory.getCurrentSession();,默认sessionFactory.getCurrentSession();获取的Session是可以自动提交的!
hydra526754427 2013-05-10
  • 打赏
  • 举报
回复
请问defaultAutoCommit设置为false,事务不提交 设置为true,不回滚 这个问题怎么解决啊·· 求教
andy_swc 2013-01-17
  • 打赏
  • 举报
回复
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> <!--配置事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置通知 --> <tx:advice id="txAdvice"> <tx:attributes> <tx:method name="find*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- 配置通知器 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.svse.service.*Service.*(..))"/> </aop:config> <bean id="usersDao" class="com.svse.dao.hibernate.UsersDaoHibernate"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="usersService" class="com.svse.service.impl.UsersServiceImpl"> <property name="usersDao" ref="usersDao"></property> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean>
wolfrx0080 2013-01-17
  • 打赏
  • 举报
回复
自己顶一下,还请知道的大哥说一下啊!困扰很久了
yujian10962 2013-01-17
  • 打赏
  • 举报
回复
貌似现在很多人是用自动代理对象.至于hibernate事务提交好像是自动进行的,只需要调用sping生成的对象
wolfrx0080 2013-01-17
  • 打赏
  • 举报
回复
来向大家汇报一下最新情况: 采用了1楼romantic112的方法设置成<property name="defaultAutoCommit"><value>true</value></property>之后是会提交了,但是事务却无法回滚了。 而设置成false就无法自动提交。 然后7楼andy_swc的方法,我本来就有设置,不过我还是把andy_swc的代码考到我的配置文件里,依然和最初的问题一样不提交,defaultAutoCommit设置成true就提交,但是无法回滚。 现在怀疑是否是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:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<!-- bonecp -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName">
            <value>oracle.jdbc.driver.OracleDriver</value>
        </property>
        <property name="url">
            <value>jdbc:oracle:thin:@192.168.1.3:1521:am8</value>
        </property>
        <property name="username">
            <value>am8</value>
        </property>
        <property name="password">
            <value>english</value>
        </property>
         <property name="initialSize">
            <value>0</value>
        </property>
         <property name="maxActive">
            <value>30</value>
        </property>
         <property name="maxIdle">
            <value>10</value>
        </property>
         <property name="defaultAutoCommit">
            <value>true</value>
        </property>
</bean> 

	<!-- 配置sessionFactory, 为Hibernate配置属性 -->

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

		<property name="dataSource">

			<ref local="dataSource" />

		</property>

	   <property name="configLocation"> 
        <value>classpath:hibernate.cfg.xml</value> 
       </property>    

		<property name="hibernateProperties">

			<props>

				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>

				<prop key="hibernate.show_sql">true</prop>

			</props>

		</property>

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

		<tx:advice id="txAdvice" transaction-manager="transactionManager">
			<tx:attributes>
				<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
			</tx:attributes>
		</tx:advice>

		<aop:config >
			<aop:pointcut id="allManagerMethod" expression="execution(* www.am8.manage.*.*(..))"/>
			<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
		</aop:config>
		
	<bean id="TestManageImpl" class="www.am8.manage.TestManageImpl">
		<property name="iTestDAO">
			<ref bean="TestDAO" />
		</property>
	</bean>
	
	<bean id="TestDAO" class="www.am8.pojo.TestDAO">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>
	<bean id="GuanLianDAO" class="www.am8.pojo.GuanLianDAO">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>
</beans>
wolfrx0080 2013-01-16
  • 打赏
  • 举报
回复
应该是有使用吧?因为我调用了testDAO.getHibernateTemplate().getSessionFactory().close();之后就能在数据库里看到了。 能调用这句应该就是已经托管了吧?
装死的蛇 2013-01-16
  • 打赏
  • 举报
回复
你没有采用Spring为Hibernate提供的getHibernateTemplate() 方法啊也, 你那么用只是用了Spring的注入,根本也没让Spring去托管Hibernate,所以你配置的事务切面怎么会有效果。
wolfrx0080 2013-01-16
  • 打赏
  • 举报
回复
首先谢谢这位大哥,但是还是没成功。 我的数据库配置文件是myeclipse自动生成的,没有设置defaultAutoCommit,于是我在hibernate.cfg.xml中加上了<property name="defaultAutoCommit">true</property>。 但是不论是true还是false都不行。 在补上hibernate的配置文件(已加上defaultAutoCommit后的)

<?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.Oracle9Dialect
		</property>
		<property name="connection.url">jdbc:oracle:thin:@192.168.1.3:1521:am8</property>
		<property name="connection.username">am8</property>
		<property name="connection.password">english</property>
		<property name="connection.driver_class">
			oracle.jdbc.driver.OracleDriver
		</property>
		<property name="defaultAutoCommit">true</property>
		<property name="myeclipse.connection.profile">8amtest</property>
		<mapping resource="www/am8/pojo/Test.hbm.xml" />

	</session-factory>

</hibernate-configuration>
lolitaline 2013-01-16
  • 打赏
  • 举报
回复
<bean id="dataSource_log_mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>${jdbc_log_mysql.driverClassName}</value> </property> <property name="url"> <value>${jdbc_log_mysql.url}</value> </property> <property name="username"> <value>${jdbc_log_mysql.username}</value> </property> <property name="password"> <value>${jdbc_log_mysql.password}</value> </property> <property name="initialSize"> <value>${jdbc_log_mysql.initialSize}</value> </property> <property name="maxActive"> <value>${jdbc_log_mysql.maxActive}</value> </property> <property name="maxIdle"> <value>${jdbc_log_mysql.maxIdle}</value> </property> <property name="defaultAutoCommit"> <value>${jdbc_log_mysql.defaultAutoCommit}</value> </property> </bean>
lolitaline 2013-01-16
  • 打赏
  • 举报
回复
你连接JDBC的配置呢? <property name="defaultAutoCommit"> 设置成true就可以了。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧