- 浏览: 1231001 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
采用编程式事务 事务主要分为:编程式事务和声明式事务 1、SessionFactory.getCurrentSession()和SessionFactory.openSession()的区别? * 如果是SessionFactory.getCurrentSession()来创建session,在commit后session就 自动关闭了,也就是不用再session.close()了 * 如果使用的是SessionFactory.openSession()必须显示的关闭session,因为commit后不会关闭 参见:HIBERNATE_HOME/doc/tutorial下的项目 2、SessionFactory.getCurrentSession()的配置,需要在hibernate.cfg.xml文件中加入,如下配置: *本地事务jdbc事务 <property name="hibernate.current_session_context_class">thread</property> *全局事务jta事务 <property name="hibernate.current_session_context_class">jta</property>
关于Hibernate的编程式事务,我们以增加用户的同时向数据库插入日志为例说明。
主要代码如下:
package com.bjsxt.usermgr; import com.bjsxt.usermgr.manager.UserManager; import com.bjsxt.usermgr.manager.UserManagerImpl; import com.bjsxt.usermgr.model.User; public class UserMangerTest { public static void main(String[] args) { User user = new User(); user.setName("张三"); UserManager userManager = new UserManagerImpl(); userManager.addUser(user); } }
package com.bjsxt.usermgr.manager; import java.util.Date; import org.hibernate.Session; import com.bjsxt.usermgr.model.Log; import com.bjsxt.usermgr.model.User; import com.bjsxt.usermgr.util.HibernateUtils; public class UserManagerImpl implements UserManager { public void addUser(User user) { Session session = null; try { //session = HibernateUtils.getSession(); session = HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); //持久化user session.save(user); Log log = new Log(); //log.setType("安全日志"); log.setType(null); log.setDetail("xxx用户尝试登录。。。"); log.setTime(new Date()); LogManager logManager = new LogManagerImpl(); logManager.addLog(log); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } } }
package com.bjsxt.usermgr.manager; import org.hibernate.Session; import com.bjsxt.usermgr.model.Log; import com.bjsxt.usermgr.util.HibernateUtils; public class LogManagerImpl implements LogManager { public void addLog(Log log) { Session session = HibernateUtils.getSessionFactory().getCurrentSession(); session.save(log); } }
注意上面我们使用了getCurrentSession,所以没用显式调用closeSession方法关闭session.
当增加用户的时候将插入一条数据到user表,而同时加入一条日志到log表。
那么当log.setType(null);时因为type字段不能为空,所以按编程式事务将不会在user,log表中的任何一个插入数据。即发生回滚。
具体代码见spring_hibernate_1项目。
下面我们使用spring的声明式事务来对上面代码进行改进。
显然我们将要集成spring与hibernate.
配置方法:
集成spring和hibernate * 把hibernate和spring的包引入 * 声明式事务的配置 --配置SessionFactory --配置事务管理器 --配置事务的传播特性 --配置哪些类的哪些方法进行事务管理 * 继承HibernateDaoSupport类,使用HibernateTemplate这个类来持久化数据,HibernateTemplate类 实际上是session的封装 * 默认回滚异常是RuntimException,即运行时异常,普通异常不回滚 * 在编写异常时最好一直向上抛出,有呈现层处理 * spring的事务管理需要添加在业务逻辑方法上,不要添加到DAO上
按照上面方法我们对spring_hibernate_1项目进行改进。
首先我们引入spring所需类库:我的自定义spring库里有:spring.jar,log4j-1.2.15.jar, common-logging.jar, aspectjrt.jar, aspectjweaver.jar, cglib-nodep-2.1.3.jar
第二步进行声明式事务的配置:
我们新建一个spring的配置文件applicationContext-common.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-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" > <!-- 配置sessionFactory --> <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="sessionFactory"></property> </bean> <!-- 配置事务传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 配置哪些类的方法进行事务管理 --> <aop:config> <aop:pointcut expression="execution(* com.bjsxt.usermgr.manager.*.*(..))" id="addManagerMethod"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="addManagerMethod"/> </aop:config> </beans>
第三步,我们把Dao层UserManagerImpl,LogManagerImpl继承HibernateDaoSupport,并利用getHibernateTemplate方法来获得session,对UserManagerImpl增加属性logManager,并通过ioc设置属性。
package com.bjsxt.usermgr.manager; import java.util.Date; import org.hibernate.Session; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.bjsxt.usermgr.model.Log; import com.bjsxt.usermgr.model.User; import com.bjsxt.usermgr.util.HibernateUtils; public class UserManagerImpl extends HibernateDaoSupport implements UserManager { private LogManager logManager; public void addUser(User user) { this.getHibernateTemplate().save(user); Log log = new Log(); // log.setType("安全日志"); log.setType(null); log.setDetail("xxx用户尝试登录。。。"); log.setTime(new Date()); logManager.addLog(log); } public void setLogManager(LogManager logManager) { this.logManager = logManager; } }
package com.bjsxt.usermgr.manager; import org.hibernate.Session; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.bjsxt.usermgr.model.Log; import com.bjsxt.usermgr.util.HibernateUtils; public class LogManagerImpl extends HibernateDaoSupport implements LogManager { public void addLog(Log log) { this.getHibernateTemplate().save(log); } }
第四步:创建另一个配置文件applicationContext-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-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" > <bean id="logManager" class="com.bjsxt.usermgr.manager.LogManagerImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="userManager" class="com.bjsxt.usermgr.manager.UserManagerImpl"> <property name="logManager" ref="logManager"></property> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
测试类:
package com.bjsxt.usermgr; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.bjsxt.usermgr.manager.UserManager; import com.bjsxt.usermgr.model.User; public class UserMangerTest { public static void main(String[] args) { User user = new User(); user.setName("张三"); ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext-*.xml"); UserManager userManager = (UserManager)act.getBean("userManager"); userManager.addUser(user); } }
测试插入成功,然后将log.setType("安全日志");改为 log.setType(null);,看是否有事务回滚。
具体代码见spring_hibernate_3.rar
- spring_hibernate_1.rar (14.1 KB)
- 下载次数: 20
- spring_hibernate_3.rar (17.4 KB)
- 下载次数: 27
发表评论
-
spring 3 和mybatis 3集成,并用junit4进行测试
2011-11-04 14:01 1468转:spring 3 和mybatis 3集成,并用junit ... -
java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource的解决方法
2011-11-03 16:17 2752用Myeclipse开发struts时,配置struts-co ... -
Strut2+Spring整合框架搭建
2011-11-02 22:19 1081参考:http://lukuijun.iteye.com/bl ... -
Spring+hibernate延迟加载报错解决办法之二
2010-06-29 17:28 1215在做删除操作的时候出现了org.springframework ... -
Spring+hibernate延迟加载报错解决办法之一
2010-06-29 17:25 1214我们在项目中一般都会使用Spring来管理Hibernate的 ... -
Spring项目中怎么配置log4j
2010-05-27 11:10 1588在spring项目中配置log4j http://blogg ... -
Spring与Struts集成方式三
2010-05-26 17:11 1155在集成方式一和二中我们是在web.xml中加入配置代码: & ... -
Spring与Struts集成方式二
2010-05-26 14:49 1047在集成方式一的基础上做改进: 第一种集成方案是在action ... -
Spring与Struts集成方式一
2010-05-25 14:13 919我们在Struts中在action类中调用Model层组件进行 ... -
修改Eclipse配置,使得在配置文件中完成自动完成功能。
2010-05-24 15:10 2303在Eclipse中引入spring的配置文件applicati ... -
Spring aop 基于schema的AOP支持及JoinPoint的使用、如何使用CGLIB代理
2010-05-24 14:52 4133基于schema的aop只是将配置写到配置文件中。 代 ... -
Spring AOP 概念理解及@AspectJ支持
2010-05-20 15:56 1586为了更好的理解Spring简介一文http://quicker ... -
Spirng AOP简介
2010-05-19 17:28 2286AOP 面向切面编程(AOP)通过提供另外一种思考程序结构的 ... -
Spring Bean中的自动装配——byType
2010-05-19 17:08 1184自动装配byType即通过查找类属性在配置文件中bean中定义 ... -
Spring Bean中的自动装配——byName
2010-05-19 16:34 3156自动装配(autowire)协作者 Spring IoC容器 ... -
Spring Bean的作用域:用Spring来解决Struts中Action的单实例问题
2010-05-19 10:47 1565我们知道在Struts中Action是从map中拿出来的,是单 ... -
Spring Bean定义的继承
2010-05-19 10:36 1330现有Bean2,Bean3,Bean4,Bean5 可观察到 ... -
Spring Set注入:基本类型、List、Map、Set、Array、Date类型注入
2010-05-18 15:58 11553Spring依赖注入有两种:构造器注入与Set注入 其中以S ... -
spring 初探
2010-05-17 16:53 1258Spring核心设计思想为IOC ... -
简单DAO层示例
2010-05-14 17:30 2085在使用spring架构之前,我们怎么设计自己的DAO层的呢? ...
相关推荐
在"声明式事务控制,spring2.5+hibernate3集成源码"中,开发者可以学习如何配置Spring的事务管理器,以及如何在Hibernate的SessionFactory和SessionFactoryBuilder上使用Spring的TransactionProxyFactoryBean来创建...
5. **事务管理**: Spring提供了声明式事务管理,可以在配置文件中定义事务管理器,并在需要事务控制的方法上添加`@Transactional`注解。这样,Spring会自动处理事务的开始、提交或回滚。 6. **测试和运行**: 最后,...
本文将深入探讨如何将Spring与Hibernate进行集成,并重点介绍声明式事务的配置与使用。 Spring框架是一个全面的企业级应用开发框架,它提供依赖注入(DI)和面向切面编程(AOP)等功能,简化了Java应用的复杂性。另...
本篇将详细介绍如何在Spring 3和Hibernate 4中通过注解来实现声明式事务管理。 首先,我们需要在项目中引入Spring和Hibernate的依赖库。这通常通过Maven或Gradle等构建工具完成,确保添加了相应的依赖项。 接着,...
Spring提供了声明式事务管理,这使得事务管理代码不再需要硬编码到业务逻辑中,而是通过配置来实现。AOP代理可以在方法调用前后自动执行事务相关的操作,如开启、提交、回滚事务,大大提高了代码的整洁度。 3. **...
Spring2.5和Hibernate3集成 采用声明式事务 1.声明式事务的配置 * 配置sessionFactory * 配置事务管理器 * 配置事务的传播特性 * 配置哪些类哪些方法使用事务 2.编写业务逻辑方法 * 继承...
编程式事务管理需要开发者显式调用开始、提交、回滚等事务管理API,而声明式事务管理则更简洁,只需要在配置中声明事务属性,由Spring自动处理事务的生命周期。 在Hibernate中,事务通常与数据库连接紧密相关,通过...
本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...
Spring提供了一种统一的事务管理接口,支持编程式和声明式事务管理。编程式事务管理允许开发者在代码中显式地开始、提交、回滚事务;而声明式事务管理则更简单,通过在方法或类上添加注解,Spring会自动处理事务的...
标题中的“spring,hibernate整合实现事务管理(MethodInterceptor)”是指在Java开发中,使用Spring框架与Hibernate ORM框架进行集成,以实现应用的事务管理。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)...
总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...
在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细粒度的控制或者在特定场景下,我们可能需要采用编程式事务管理。 首先,了解事务的四大特性(ACID)是必...
本教程将深入探讨如何在Spring框架中利用`TransactionInterceptor`进行声明式事务管理,与Hibernate集成实现高效的数据库事务控制。 首先,了解事务管理是至关重要的。事务是一组数据库操作,这些操作要么全部成功...
本实例将深入探讨如何结合Spring的注解声明式事务管理与Hibernate的数据访问技术,构建一个完整的事务处理系统。 Spring框架以其灵活的依赖注入(DI)和面向切面编程(AOP)闻名,它允许开发者将事务管理从业务逻辑...
1. **事务管理**:Spring提供了一套声明式事务管理机制,可以方便地与Hibernate等持久层技术结合使用,实现细粒度的事务控制。 2. **对象关系映射**:Hibernate通过配置文件或注解的方式定义实体类与数据库表之间的...
本实例工程展示了如何在Spring 3和Hibernate 4中使用注解进行声明式事务管理,这是一种高效且易于维护的方法。接下来,我们将详细讨论相关知识点。 1. **Spring框架**:Spring是一个全面的后端开发框架,它提供了...
本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...