`
lijiejava
  • 浏览: 259316 次
  • 性别: Icon_minigender_1
  • 来自: 南通
社区版块
存档分类
最新评论

spring声明式事务

阅读更多
spring声明式事务不起作用

代码如下:

User类:
public class User {

	private int id;
	
	private String username;
	
	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}



manager层
public interface UserMgr {

	public void saveUser(User user); 
	
}

public class UserMgrImpl implements UserMgr {
    
	private UserDao userDao; 
	
	public void saveUser(User user) {
		 userDao.saveUser(user); 
		 throw new RuntimeException();
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	} 

}



dao层:
public interface UserDao {

	public void saveUser(User user);
	
}

public class UserDaoImpl implements UserDao {
 
	private SessionFactory sessionFactory;
	
	public void saveUser(User user) {  
		Session session = sessionFactory.openSession();
		session.save(user); 
	}

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


测试类:
public class UserTest extends TestCase {

	public void test1(){
		ApplicationContext ctx = (ApplicationContext)new FileSystemXmlApplicationContext("applicationContext-*.xml");
	    UserMgr mgr = (UserMgr)ctx.getBean("manager");
	    
	    User user = new User(); 
	    user.setUsername("AAA");
	    user.setPassword("123");
	    
	    mgr.saveUser(user); 
	}
}


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.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
 

   <bean id="userDao" class="dao.UserDaoImpl">
       <property name="sessionFactory" ref="sessionFactory"></property> 
   </bean>    
   
   <bean id="manager" class="manager.UserMgrImpl">
      <property name="userDao" ref="userDao"></property>
   </bean>
   
	 	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation">
			<value>classpath:hibernate.cfg.xml</value>
		</property>	
	</bean>           
	
	 	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>	
	</bean>
	
	 	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED"/> 
		</tx:attributes>
	</tx:advice>  
	
	 	<aop:config>
		<aop:pointcut id="allManagerMethod" expression="execution(* manager.*.*(..))"/>
		<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
	</aop:config>
	  
</beans>


为什么spring事务不起作用,记录还会存到数据库。但是,如果UserDaoImpl继承HibernateDaoSupport,采用this.getHibernateTemplate().save(user),spring事务就起作用。小弟是个菜鸟,刚学spring,哪位高手可以解释一下。
分享到:
评论
1 楼 lijiejava 2010-05-22  
此问题已经解决,spring事务控制必须确保是同一个connection(此处就是session),如果不继承HibernateDaoSupport,那么为了获得与事务控制相同的session,可以通过spring的工具类SessionFactoryUtils,即: 
Session session = SessionFactoryUtils.getNewSession(sessionFactory);

或者通过下面的方法获得session:
Session session = sessionFactory.getCurrentSession();

  如果直接继承HibernateDaoSupport类,那么其内部是通过SessionFactoryUtils来获得session的。

相关推荐

Global site tag (gtag.js) - Google Analytics