`

hibernate的事务处理

阅读更多

在使用hibernate开发时,遇到最多的就是session与事务,那么他们两个有什么关系呢?下面我来抛砖引玉:
        1、session是hibernate中的以及缓存机制,是用来对数据进行增删改查的一个东西(具体是什么我也不是很清楚,可以理解为是用来操作数据的)
        2、事务是一组操作单元的集合,用的比较多的是conmmit和rollback这两个方法,前面的提交后面的回滚。
        先看下面的两段代码:
        代码1:

        Configuration config = new  Configuration().configure("com/ebookstore/config/hibernate.cfg.xml");
        Session session = config.buildSessionFactory().openSession();

        Transaction tran=session.beginTransaction();
        tran.begin();

        session.save(object);
        tran.commit();
        session.flush();

        代码2:

        Configuration config = new  Configuration().configure("com/ebookstore/config/hibernate.cfg.xml");
        Session session = config.buildSessionFactory().openSession();

        Object obj = session.get(dtoclass, id);
        session.flush();

        代码1:用到了事务,而代码二呢没有,这是怎么原因呢?我们可以从两个方面去理解:

            1、在对数据进行查找时,即使你失败并不影响数据库中的数据;在对数据库进行添加时,那就不同了,当你添加数据失败时,可能会在数据库中留下垃圾数据。这是我们就要用到事务,事务他提交失败时,他就会自动回滚。这样就不影响数据库了。

            2、在对hibernate框架使用时,你不重新开启事务的话,你是不能对数据进行增删改的,因为事务默认为是失败的,也就是数他一直处于回滚状态。所以你每次操作都是不成功的!
***********************************************************************
在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的。在利用Spring + Hibernate进行开发时也是如此。下面是一个简单的Spring + Hibernate Dao的例子:

程序代码:public class DaoReal extends HibernateDaoSupport implements Dao {
  public List<User> getAll() {
    return super.getHibernateTemplate().find("from User");
  }
}
  在上面的这个例子中,我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。那么再看一个例子:

程序代码:public class DaoReal extends HibernateDaoSupport implements Dao {
  public List<User> getAll() {
     return super.getSession().createQuery("from User").list();
  }
}
  这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是Spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n<=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。那么我们手动关闭Session后,应该就没有问题了吧!是这样吗?修改我们的例子,如下:

程序代码:public class DaoReal extends HibernateDaoSupport implements Dao {
  public List<User> getAll() {
    Session s = super.getSession();
    try {
      return s.createQuery("from User").list();
    } finally {
      s.close();
    }
  }
}
  执行n遍后依然停止响应。问题出在哪里呢?其实Spring的Session总是与某个线程绑定的,而这个线程往往就是承载Servlet或Jsp的那个线程,也就是说,它的生命周期scope是request的。在上面的例子中,我们利用getSession强制获得了Hibernate的Session,这个Session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,Spring只对当前事务中的Session进行关闭。

  要解决这个问题,方法有很多。可以使用我们之前讲到过的getHibernateTemplate().find()。也可以设定HibernateTemplate的AllowCreate为True,并在finally中关闭Session。也可以将true作为参数传递到super.getSession(..)方法中取得Session。这里的true表示允许创建

分享到:
评论

相关推荐

    详解Hibernate事务处理机制

    ### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...

    Hibernate事务处理

    ### Hibernate事务处理详解 #### 一、事务处理概念与特性 事务处理是数据库操作中一个核心的概念,尤其在处理复杂的业务逻辑时,确保数据的一致性和完整性至关重要。Hibernate作为Java领域中广泛使用的对象关系...

    Spring Hibernate 事务处理 详细说明

    在企业级Java应用开发中,事务处理是核心功能之一,确保数据的一致性和完整性。本篇文章将深入探讨Spring与Hibernate整合下的事务管理,帮助开发者理解并掌握这一关键知识点。 首先,Spring框架提供了声明式事务...

    Spring 1_2的hibernate事务处理

    Spring 1_2的hibernate事务处理,更加详细的说明事务的处理在SPRING中

    spring整合hibernate实现事务处理

    在`Spring_1800_Spring_Hibernate_Transaction_Annotation`这个压缩包文件中,很可能包含了使用注解方式实现Spring整合Hibernate事务处理的相关示例代码和配置文件。通过阅读和理解这些代码,你可以更好地掌握这一...

    Spring Hibernate事务实例

    2. Hibernate事务管理:使用`HibernateTransactionManager`结合SessionFactory进行事务控制。 3. AOP(面向切面编程)在事务管理中的应用:`TransactionInterceptor`基于AOP拦截方法调用,处理事务。 4. 配置事务...

    Hibernate事务(源码)

    **Hibernate事务管理详解** 在Java开发中,尤其是在企业级应用中,事务管理是不可或缺的一部分。Hibernate作为一款流行的ORM(对象关系映射)框架,提供了强大的事务处理能力。本篇文章将深入探讨Hibernate中的事务...

    在Spring中配置Hibernate事务

    在Spring框架中集成和配置Hibernate事务管理是企业级Java应用中的常见实践,它能提供高效且灵活的事务处理策略。Spring作为一款强大的依赖注入(DI)和面向切面编程(AOP)容器,能够轻松地管理和协调不同数据访问...

    spring hibernate 事务管理学习笔记(一)

    然而,单独使用Hibernate时,事务管理往往需要手动处理,增加了复杂性。 当Spring与Hibernate整合时,Spring的事务管理可以自动地覆盖Hibernate的事务管理,实现全局的一致性。在Spring中,我们可以配置`...

    day36 09-Hibernate中的事务:事务处理

    **一、Hibernate事务的概念** 事务是一组数据库操作,这些操作被视为一个逻辑单元,要么全部执行,要么全部不执行。这是为了保证数据的一致性。在Hibernate中,事务管理通常通过SessionFactory和Session接口来实现。...

    Spring+Hibernate注解事务实例

    本实例将深入探讨如何结合Spring的注解声明式事务管理与Hibernate的数据访问技术,构建一个完整的事务处理系统。 Spring框架以其灵活的依赖注入(DI)和面向切面编程(AOP)闻名,它允许开发者将事务管理从业务逻辑...

    Hibernate的事务处理机制和flush方法的用法.docx

    在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...

    hibernate事务,并发及缓存管理实例

    一、Hibernate事务管理 在数据库操作中,事务确保了数据的一致性和完整性。Hibernate提供了四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化...

    对Hibernate事物的理解

    理解Hibernate事务处理机制对于确保数据的一致性和完整性至关重要。 ### 1. 事务的基本概念 在数据库系统中,事务是数据库操作的基本单位,它包含了对数据库的一系列原子操作。一个事务中的所有操作要么全部完成,...

    spring hibernate 事务管理学习笔记(二)

    为了优化事务处理,Spring和Hibernate还支持开放Session in View(OSIV)模式。在Web应用中,为了避免因为Session在请求结束时自动关闭导致的部分更新丢失问题,OSIV模式会在整个视图渲染过程中保持Session打开,...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    而Hibernate则是一款强大的对象关系映射(ORM)工具,它简化了数据库操作,使开发者可以使用面向对象的方式来处理数据库事务。本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring ...

    Hibernate DOC 中文文档

    **九、Hibernate事务处理** Hibernate支持JTA(Java Transaction API)和JDBC事务,可以通过Transaction接口进行事务的开始、提交、回滚等操作,确保数据的一致性。 **十、总结** Hibernate DOC 中文文档详尽地...

    hibernate5.1.10 依赖jar包

    Hibernate事务处理** 在Hibernate中,可以通过Session的beginTransaction()、commit()和rollback()方法管理事务。事务是数据库操作的基本单元,确保数据的一致性和完整性。 **8. 第二级缓存和查询缓存** 为了提高...

    spring mvc+hibernate 实现事务管理(全注解版)

    2. **Hibernate事务**: Hibernate本身也提供了一种事务管理机制,但在Spring环境中,我们通常使用Spring的事务管理器来协调。当@Transactional注解应用于方法上,Spring会在该方法执行前后自动管理事务的开始和结束...

    Hibernate性能(缓存 延迟加载 事务 悲观 乐观锁).ppt

    Hibernate事务处理** 在数据库操作中,事务管理是保证数据一致性和完整性的基础。Hibernate支持JTA(Java Transaction API)和JDBC事务管理。通过`session.beginTransaction()`开启事务,`transaction.commit()`...

Global site tag (gtag.js) - Google Analytics