User
package org.lazyzhong.model; public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User() { super(); } }
UserDAO
package org.lazyzhong.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.lazyzhong.model.User; public class UserDAO{ private SessionFactory sessionFactory; public Session getSession() { return sessionFactory.getCurrentSession(); } public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public User getUserById(int id){ Session session = getSession(); User u=(User)session.get(User.class,1); return u; } public void addUser(User u){ Session session = getSession(); session.save(u); } }
UserService
package org.lazyzhong.service; import org.lazyzhong.dao.UserDAO; import org.lazyzhong.model.User; public class UserService{ private UserDAO userDAO; public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public User getUser(int id){ return userDAO.getUserById(1); } public void addUser(User u){ userDAO.addUser(u); } }
beans.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: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.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/lazystudy?useUnicode=true&characterEncoding=UTF-8" /> <property name="username" value="root" /> <property name="password" value="" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="connection.characterEncoding">UTF-8</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <property name="mappingResources"> <list> <value>org/lazyzhong/model/User.hbm.xml</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <!-- schema方式... <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="daoMethods" expression="execution(* org.lazyzhong.service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods" /> </aop:config> --> <bean id="userDAO" class="org.lazyzhong.dao.UserDAO"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="userService" class="org.lazyzhong.service.UserService"> <property name="userDAO" ref="userDAO" /> </bean> <!-- TransactionProxyFactoryBean方式,这种方式会让配置文件很臃肿,因为每个目标bean都要另外弄一个代理bean... 但是可以通过bean继承的方式来稍微减少代码量。。。 <bean id="userProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 注入事务管理器 <property name="transactionManager" ref="transactionManager" /> 设置事务属性 <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> 设置目标bean.. <property name="target" ref="userService" /> </bean> --> <!-- BeanNameAutoProxyCreator方式。。。这种方法主要利用了拦截器的原理。 <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>userService</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> --> </beans>
在Spring声明式事务管理的配置中,hibernate.current_session_context_class=thread…这一句是不能加的…加了就会出错..因为在Spring事务管理中,current Session是绑定到SpringSessionContext中的,而不是ThreadLocalSessionContext中的。
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
相关推荐
Spring注解驱动开发第35讲——声明式事务原理的源码分析
Spring框架提供了两种主要类型的事务管理方式:编程式事务管理和声明式事务管理。声明式事务管理通过XML配置或注解的形式定义事务边界,使得业务逻辑与事务控制分离。 ### 描述分析:XML配置示例 提供的XML配置...
Spring 声明式事务处理与多数据源支持 在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。Spring 框架提供了声明式事务处理机制,使得业务代码中进行事务控制操作起来非常简单。只需...
在Spring框架中,声明式事务管理是实现事务处理的一种高效且灵活的方式,它允许开发者通过XML配置或注解来定义事务边界,而无需在业务逻辑代码中显式地调用开始、提交或回滚事务的方法。这篇博文"Spring使用XML配置...
2. **声明式事务管理**:Spring.NET提供了基于XML配置和基于属性的两种声明式事务管理。在XML配置中,可以在`<transaction:advice>`元素中定义事务行为,然后通过`<aop:config>`或`<aop:aspect>`将事务行为应用到...
本篇文章将深入探讨Spring框架的一个关键特性——声明式事务管理。通过声明式事务,开发者可以避免手动处理事务的繁琐工作,提高代码的可读性和可维护性。 首先,我们了解什么是事务。在数据库操作中,事务是一系列...
声明式事务管理通过在配置中定义事务边界,降低了代码的复杂性。 6. **数据访问**: Spring支持多种数据库访问技术,包括JDBC、Hibernate、MyBatis等。它通过提供模板和DAO支持,简化了与数据库的交互。 7. **...
Spring提供了一种强大的声明式事务管理机制,它允许我们在不编写任何事务控制代码的情况下,通过配置来管理事务。这极大地简化了事务处理,尤其是在处理JMS时,事务管理显得尤为重要。 在Spring整合JMS的过程中,...
#### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。Spring支持两种类型的事务管理...
通常与spring-aop.jar一起使用,以实现声明式事务管理。 6. **spring-hibernate.jar**:这是Spring对Hibernate ORM框架的封装,使得使用Hibernate更加方便。 7. **spring-jdbc.jar**:提供对JDBC数据库访问的抽象...
声明式事务管理是通过配置的方式设置事务的边界,通常通过Spring的`@Transactional`注解或者XML配置来实现。这种方式比编程式事务管理更为简洁和方便。 **示例:传统的JDBC事务管理** 在使用JDBC进行数据操作时,...
在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细粒度的控制或者在特定场景下,我们可能需要采用编程式事务管理。 首先,了解事务的四大特性(ACID)是必...
`@Transactional`注解来自`org.springframework.transaction.annotation`包,它是Spring对声明式事务管理的主要支持。这个注解可以应用在类或方法级别,用来定义事务的边界。当注解在类级别时,所有该类的公共方法都...
### Spring事务管理——声明式事务配置详解 #### 引言 在现代的Java企业级应用开发中,事务处理是确保数据一致性和完整性的重要机制。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务管理方式。...
在Spring框架中,事务管理分为编程式事务管理和声明式事务管理两种方式。编程式事务管理通过调用`PlatformTransactionManager`接口的方法来手动开始、提交、回滚事务。而声明式事务管理则是通过配置元数据(如XML或...
Spring事务管理分为编程式事务管理和声明式事务管理两种方式。编程式事务管理是通过调用TransactionTemplate或PlatformTransactionManager接口的方法来显式地开始、提交、回滚事务。这种方式虽然灵活,但容易导致...
- 在Spring XML配置文件中,事务管理器(如`DataSourceTransactionManager`或`JtaTransactionManager`)通常会定义在`<bean>`标签中,并通过`<tx:annotation-driven>`来启用声明式事务管理。 5. **数据库兼容性**...
总结来说,Spring的声明式事务管理通过AOP机制提供了更为优雅的解决方案,能够有效地将事务管理与业务逻辑分离,减少代码重复,提高代码的可维护性和可扩展性。在实际项目开发中,我们应当优先考虑使用声明式事务...
在CRM系统中,Spring作为“胶水”连接各个组件,管理对象的生命周期,同时提供声明式事务管理,确保数据的一致性。 4. **AJAX技术** AJAX(Asynchronous JavaScript and XML)允许网页在不刷新整个页面的情况下,...