spring2.5 学习笔记 第31页 共46页
(二) annotation注解方式的SessionFactory 再是在配置数据源时可以使用占位符(${})获取一些值 bean(org.springframework.beans.factory.config.PropertyPlaceholderConfigurer)
spring2.5 学习笔记 第33页 共46页
1、 首先:如果想使用Spring管理事务,则首需要在配置文件中加入下列(上面红色加粗部分):
xmlns:tx=\ xsi:schemaLocation=”http://www.springframework.org/schema/tx
org.springframework.jdbc.datasource.DataSourceTransactionManager,,并且需要注入一个SessionFactory的bean,利用这个bean可以获取数据源配置等其它的数据库信息。但要求已经在这之前配置了一个SessionFactory的bean了。
上面的刚则配置的txManager),
…… } spring2.5 学习笔记 第34页 共46页
这样,Spring就会对这个方法进行事务管理了。 5、 实例:
场景:当保存一个用户后,需要向数据库添加一条日志记录,说明已经添加一个用户了。需要使用Spring管理其事务,如果两者有一者发生异常,执都需要进行回滚。 1) 2)
Spring的配置文件同上; 代码
Log实体类 @Entity @Table(name=\) public class Log { } User实体类 @Entity public class User { } UserDao接口的实现 @Component(\) public class UserDaoImpl implements UserDao { LogDao接口的实现 @Component(\) private SessionFactory sessionFactory; public SessionFactory getSessionFactory() {return sessionFactory;} //这里的sessionFactory是使用AOP进行自动装配,切记这是AOP的功能 @Resource(name=\) public void setSessionFactory(SessionFactory sessionFactory) { } //在这里并没有事务的管理,常规这里应该有处理事务的代码,但是现在没有了,因为现在由Spring来管理了。 //我们关心只是业务逻辑了。 @Override public void save(User u) { }} Session session = null; this.sessionFactory = sessionFactory; private int id; private String name; ?? private int id; private String msg; ?? //记住一定需要使用getCurrentSession()来从上下文中获取Session这样Spring才可以管理事务。 session = sessionFactory.getCurrentSession();// session.save(u); System.out.println(\); spring2.5 学习笔记 第35页 共46页
public class LogDaoImpl implements LogDao { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() {return sessionFactory;} //这里的sessionFactory是使用AOP进行自动装配,切记这是AOP的功能,注入的bean的Id是sessionFactory @Resource(name=\) public void setSessionFactory(SessionFactory sessionFactory) { } this.sessionFactory = sessionFactory; //在这里并没有事务的管理,常规这里应该有处理事务的代码,但是现在没有了,因为现在由Spring来管理了。
业务层代码 @Component(value=\) public class UserService { } 这样,只有这个方法中的所有代码没有异常,才会执行完,否则所有的事务将全部回滚
测试代码: public void testAdd_4() throws Exception { ApplicationContext factory = new ClassPathXmlApplicationContext(\); UserService service = (UserService)factory.getBean(\); //只需要在需要进行事务管理的方法上加上 @Transactional public void add(User u){ } userDao.save(u); Log log = new Log(); log.setMsg(u.getName() + \保存成功!\); logDao.save(log); @Transactional 就可以了,Spring就会对其进行事务管理 private LogDao logDao; public LogDao getLogDao() { return logDao;} @Resource(name=\) public void setLogDao(LogDao logDao) { this.logDao = logDao;} public UserDao getUserDao() { return userDao; } //注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource(name=\) public void setUserDao(UserDao userDao) { this.userDao = userDao; } private UserDao userDao = new UserDaoImpl(); //我们关心只是业务逻辑了。 @Override public void save(Log log) { }} Session session = null; //记住一定需要使用getCurrentSession()来从上下文中获取Session这样Spring才可以管理事务。 session = sessionFactory.getCurrentSession(); session.save(log); System.out.println(\); //利用Spring自动注入功能,将其注入