这里是利用 cglib 的代理功能实现业务类的统一事务管理,以达到在业务类的每个方法上自动开启与关闭事务,而免区在每个业务方法里写事务代码的烦恼。且业务类既可以实现接口使代理返回接口,或不实现接口使代理返回对象。
在这里用到了 Hibernate 的 getCurrentSession() ,因此需要在 hibernate.cfg.xml 里加上下面这句,仅示例:
<property name="hibernate.current_session_context_class">thread</property>
实体 Student 定义如下:
public class Student {
private Integer id;
private String name;
private String phone;
// 。。。。
}
hibernate.cfg.xml 如下:
<?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">
<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/tthibernate?useUnicode=true&characterEncoding=utf8
</property>
<property name="connection.username">root</property>
<property name="connection.password">sa</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="test1/vo/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
获取 hibernate factory 的工具类:
public class HibernateUtil {
private static SessionFactory sessionFactory;
static{
sessionFactory = new Configuration().configure().buildSessionFactory();
}
public static SessionFactory getSessionFactory(){
if(sessionFactory==null){
Configuration conf = new Configuration().configure();
sessionFactory = conf.buildSessionFactory();
}
return sessionFactory;
}
}
动态添加事务的拦截器:
public class TransctionInterceptor implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy mp) throws Throwable {
// TODO Auto-generated method stub
SessionFactory sf = HibernateUtil.getSessionFactory();
Session ss = sf.getCurrentSession();
Transaction ts = ss.beginTransaction();
Object rObj = null;
try{
rObj = mp.invokeSuper(obj, args);
ts.commit();
}
catch(Exception e){
e.printStackTrace();
ts.rollback();
}
return rObj;
}
}
实现业务类代理的类:
public class HibernateBusiness {
// 返回需要业务代理对象
public static Object getBusiness(Class clazz){
Enhancer eh = new Enhancer();
eh.setSuperclass(clazz);
eh.setCallback(new TransctionInterceptor());
return eh.create();
}
}
数据库操作层:
public class StudentDao {
private SessionFactory sf;
public StudentDao(){
sf = HibernateUtil.getSessionFactory();
}
public void insertRightStudent()throws Exception{
Student stu = new Student();
stu.setName("b");
stu.setPhone("22");
try {
Session ss = sf.getCurrentSession();
ss.save(stu);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new Exception("exception 1");
}
}
public void insertErrorStudent()throws Exception{
Student stu = new Student();
stu.setName("a");
stu.setPhone("11");
Session ss = sf.getCurrentSession();
try {
// 前提数据库中不存在 id 为 99 的学生,这样下面语句会报错,从而达到事务回滚
Student stus = (Student)ss.load(Student.class, new Integer(99));
stus.getName();
// 数据为插入
ss.save(stu);
} catch (Exception e) {
// TODO Auto-generated catch block
throw new Exception("exception 2");
}
}
}
业务接口与实现,在这里也可以不实现该接口,以避免每个业务类都需要继承接口:
public interface StudentBusinessIf {
public void testRightStudent()throws Exception;
public void testErrorStudent()throws Exception;
}
public class StudentBusiness implements StudentBusinessIf{
private StudentDao studao;
public StudentBusiness(){
studao = new StudentDao();
}
public void testRightStudent()throws Exception{
// 将成功插入数据
studao.insertRightStudent();
}
public void testErrorStudent()throws Exception{
// 插入数据将失败
studao.insertErrorStudent();
}
}
最后是测试类,实际中可为action 等:
public class StudentAction {
public static void main(String[] args){
// TODO Auto-generated method stub
/*
* 下面两种代理均可
*/
// 得到业务代理对象,接口代理,
StudentBusinessIf sb = (StudentBusinessIf)HibernateBusiness.getBusiness(StudentBusiness.class);
// 得到业务代理对象, 实际对象代理
//StudentBusiness sb = (StudentBusiness)HibernateBusiness.getBusiness(StudentBusiness.class);
try {
// 正确插入数据测试
sb.testRightStudent();
// 错误插入数据测试
sb.testErrorStudent();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样就完成了统一事务管理的整个过程,所以如果想让自己的业务类或其他类的方法具有事务自动开启与关闭功能,只需要象下面这样返回代理即可:
// 得到业务代理对象,接口代理, 用于实现接口的业务类等
StudentBusinessIf sb = (StudentBusinessIf)HibernateBusiness.getBusiness(StudentBusiness.class);
// 或是下面这样
// 得到业务代理对象, 实际对象代理,用于未实现接口的业务类等
StudentBusiness sb = (StudentBusiness)HibernateBusiness.getBusiness(StudentBusiness.class);
分享到:
相关推荐
1. **Hibernate事务管理:** - Session API:Hibernate的Session对象是操作数据库的基本单元,它支持begin、commit和rollback等事务操作。 - Transaction API:Hibernate的Transaction接口提供了更高级别的事务...
当Spring和Hibernate结合使用时,Spring的事务管理可以覆盖Hibernate的事务,这样可以确保事务的统一性和一致性。例如,在上述的`UserService`中,即使我们在`userRepository.save(user)`操作中遇到问题,由于事务...
### Hibernate事务处理详解 #### 一、事务处理概念与特性 事务处理是数据库操作中一个核心的概念,尤其在处理复杂的业务逻辑时,确保数据的一致性和完整性至关重要。Hibernate作为Java领域中广泛使用的对象关系...
在使用Hibernate进行数据库操作时,事务管理和`flush`方法的正确使用至关重要,因为它们直接影响到数据的一致性和安全性。在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些...
本主题将探讨“Spring4+Hibernate4+Atomikos3.3多数据源事务管理”的相关知识点,这是一种实现分布式事务处理的有效方案。 首先,Spring框架是Java企业级应用中的核心组件,它提供了一个统一的依赖注入容器,简化了...
Hibernate支持JDBC事务和JTA(Java Transaction API)事务,可以与Spring的事务管理机制集成,实现统一的事务策略。 在SSH事务配置中,提到的“通用性”是指通过合理配置,可以将事务管理应用到多个DAO(数据访问...
【标题】"很好用的学生信息管理系统,Struts2+hibernate+spring"是一个基于Java技术的教育管理软件,主要用于管理学生数据。该系统利用了Struts2、Hibernate和Spring三大框架,构建了一个高效且易维护的后台架构。 ...
Spring与Hibernate的集成使得开发者可以在一个统一的环境中管理业务逻辑和数据访问,提高开发效率。集成的关键在于Spring的Transaction Management,它提供了声明式和编程式两种事务管理方式。声明式事务管理是通过...
本文将深入探讨在业务层实现Hibernate事务控制的方法,特别关注通过动态代理技术来实现对业务对象(BO)的事务控制。 #### 二、问题背景 在传统的基于DAO(Data Access Object)模式的应用程序中,每个DAO类通常...
iBATIS DAO事务管理实现了对多种事务管理框架的支持,为开发者提供了统一的事务管理接口。通过对DaoContext接口的调用,事务处理被有效地传递给了持久层进行处理。此外,通过使用桥梁模式,iBATIS DAO事务管理框架...
3. 配置简化:Spring可以统一管理Hibernate的SessionFactory和Session,简化配置文件。 4. AOP集成:Spring的AOP可以与Hibernate的事务管理结合,提供更灵活的事务策略。 四、整合步骤 1. 引入依赖:在项目中添加...
在系统重构中,Hibernate可以帮助实现数据库操作的统一管理和优化。 MyBatis框架: MyBatis相对于Hibernate更轻量级,它允许开发者编写手写SQL,同时保持对象与SQL查询的映射。MyBatis通过XML或注解的方式配置和...
它提供了一种统一的方式来管理跨越多个资源(如数据库、消息队列等)的分布式事务。通过JTA,应用程序可以在一个事务中执行多个操作,确保所有操作要么全部成功,要么全部回滚,实现了ACID(原子性、一致性、隔离性...
Hibernate的懒加载、缓存策略以及事务管理等高级特性,使得它能高效地与关系型数据库进行交互,满足现代应用程序对数据持久化的需求。 北京动力节点教育培训公司提供的Hibernate5讲义,不仅对Hibernate框架进行了...
1. Hibernate支持编程式事务管理和声明式事务管理,可以配合Spring等框架实现事务的统一管理。 七、Annotation使用 1. Annotation配置比XML配置更简洁,直接在实体类上定义属性,无需编写额外的映射文件。 2. 使用...
声明式事务管理则是通过在配置文件中声明事务规则,使用 AOP 切面进行事务控制,适用于大部分情况,因为它可以实现事务的统一管理和隔离。 Spring 和 Hibernate 整合的关键步骤包括: 1. 添加 Spring 和 Hibernate ...
Spring的AOP(面向切面编程)功能可以实现事务的统一管理,确保数据的一致性。同时,Spring还提供了DAO(数据访问对象)模板,简化了数据库操作,降低了代码的重复性。 五、系统功能模块 1. 供应商管理:包括供应...
5. **事务管理**:提供开始、提交、回滚事务的方法,确保数据一致性。 四、 xjpa-master项目简介 "xjpa-master"可能是一个开源项目,它封装了Hibernate的操作接口,提供了简化的API供开发者使用。项目可能包括以下...
Spring将Hibernate的异常转换为Spring的`DataAccessException`系列异常,使得异常处理更加统一。 10. **测试与调试** 在集成环境中,我们可以使用Spring的`TestContextFramework`进行单元测试,它能够自动配置...
Hibernate 是一个开源的...理解并熟练使用这些核心包,开发者可以轻松地创建、更新、查询和删除数据库中的数据,同时还能利用 Hibernate 提供的缓存机制、事务管理和对象关系映射功能,提高开发效率和应用程序性能。