`

被Hibernate的Session绊了一跤

    博客分类:
  • Java
阅读更多

写这篇博客的原因是出于昨天我在问答频道的一个问题,该问题如下:

 

    当在servlet中调用DAO的save方法并提交事务后,控制台显示已经执行了sql语句,但是却没有向数据库中记录,如果把数据库的隔离级别设置为未提交读,这是可以看见刚插入的记录,但是之前已经调用了提交事务的语句,这是为什么呢? 
注:主键生成策略为“native”,数据库是MySQL。
问题补充:
已经把数据库操作放到了事务中,而当第二条记录提交的时候才会向数据库中插入第一条记录,而新提交的记录不会被插入。
问题补充:

Java代码 ;
  1. UserDAO userDAO = new UserDAO();  
  2.         User user = new User();  
  3.           
  4.         SessionFactory sessionFactory = HibernateSessionFactory.getSessionFactory();  
  5.         Session session = sessionFactory.openSession();  
  6.         Transaction tx = null;  
  7.           
  8.         user.setUsername(registerForm.getUsername());  
  9.           
  10.         user.setEmail(registerForm.getEmail());  
  11.   
  12.         try {  
  13.             tx = session.beginTransaction();  
  14.             userDAO.save(user);  
  15.             tx.commit();  
  16.         }  
  17.         catch (RuntimeException e) {  
  18.             if (tx != null)  
  19.                 tx.rollback();  
  20.             throw e;   
  21.         }  
  22.         finally {  
  23.             session.close();  
  24.         }  

通过查看Hibernate的代码发现的其中的问题。
我在获得Session对象的时候采用的是 sessionFactory.openSession();  Hibernate会新产生一个Session对象,接着执行userDAO.save(user)语句,而UserDAO类的save方法中用到的Session是通过HibernateSessionFactory.getSession()方法获得的,再继续看HibernateSessionFactory,其getSession()方法如下
 public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}

        return session;
    }
 因此HibernateSessionFactory会为每个线程创建一个Session对象,MyEclipse所生成的DAO类就是用的这个
Session,这与在程序中通过openSession()方法所得到的是两个不同的Session对象,因此我在程序中调用的提交事务方法是在后一个Session中进行的,而对User对象的保存是在第一个Session中,而该Session中并没有执行提交事务操作。
    但是,至于之前的为什么当我执行第二次插入操作时会把前一条记录插入的原因还没有弄清楚,哪位大哥知道,欢迎留言。


分享到:
评论
3 楼 lectery 2009-04-15  
yangkunzhangqiong 写道

我想问楼主,你第二条数据有没有插进去了

没插进去
2 楼 yangkunzhangqiong 2009-04-15  
我想问楼主,你第二条数据有没有插进去了
1 楼 ww0901 2009-04-14  
数据库连接正常关闭时,如果没有事务提交语句,在关闭之前的DML操作会自动提交事务。ORACLE就是这样。

楼主可以具体检查一下当前MySQL的事务引擎是怎么设置的,或者直接在数据库命令行下插入一条记录,然后正常退出数据库,再检查数据库中是否插入了数据。。

相关推荐

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    "No Hibernate Session bound to thread" 错误信息通常是因为 Hibernate Session 未被绑定到当前线程所致。在 Hibernate 中,每个线程都需要一个 Session 对象来与数据库交互。如果未绑定 Session 到线程, ...

    Hibernate Session释放模式

    在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...

    Hibernate-nosession

    总结来说,Hibernate-nosession是一种优化策略,它适合于那些对性能要求较高且不涉及复杂业务逻辑的场景。通过避免频繁打开和关闭Session,可以减少资源消耗,提高系统的响应速度。在实际开发中,我们需要根据项目...

    Hibernate_Session_Transaction

    `Session`是Hibernate提供的一种与数据库交互的接口,它扮演着应用程序与数据库之间的桥梁角色。与Web开发中的`HttpSession`不同,`Hibernate Session`与JDBC的`Connection`更为相似,负责处理数据的持久化操作。`...

    hibernate session生命周期示例

    当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被创建。SessionFactory是一个线程安全的单例对象,它根据Hibernate配置文件生成。创建SessionFactory通常在应用程序启动时完成,而...

    Hibernate(session管理)

    在Java的持久化框架中,Hibernate是一个非常重要的组件,它为开发者提供了强大的对象关系映射(ORM)功能,使得在Java应用中操作数据库变得更加简单。本文将深入探讨Hibernate中的核心概念——Session管理。 首先,...

    hibernate和session学习

    在Hibernate中,`SessionFactory`是核心组件之一,它是线程安全的,用于创建`Session`对象。`SessionFactory`通常在应用启动时创建一次,然后在整个应用生命周期中复用。创建`SessionFactory`需要通过读取Hibernate...

    重写hibernate的session简单增删改查

    "重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...

    Hibernate的Session的javadoc

    Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...

    hibernate中session的管理

    首先,SessionFactory是Hibernate的核心组件,它是一个线程安全的工厂类,用于创建Session实例。SessionFactory通常在应用程序启动时初始化,并在整个应用生命周期内保持不变,因此它可以被多个并发线程共享。...

    hibernate session详细方法,值得珍藏

    在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)的关键部分。本文将深入探讨Hibernate Session的...

    hibernate session.doc

    在理解Hibernate框架中,Session是核心组件之一,它充当了应用程序和数据库之间的桥梁。`Session`接口提供了多种操作,如创建、更新、查询和删除数据,这些都是基于对象关系映射(ORM)的概念进行的。本篇文章将深入...

    Hibernate_session_factory_配置.docx

    在Java的持久层框架Hibernate中,SessionFactory是核心组件之一,它是线程安全的,负责创建Session对象,每个Session对应于数据库的一次会话。配置SessionFactory主要是通过Hibernate的配置文件(通常为hibernate....

    HibernateSession , Transaction 研究

    本文将深入研究Hibernate中的`Session`和`Transaction`,这两个概念是理解Hibernate工作原理的关键。 首先,让我们了解`Session`。在Hibernate中,`Session`充当了应用程序与数据库之间的桥梁,它是持久化操作的...

    hibernate中session对象的状态详解

    hibernate中session对象的状态详解

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、删除和检索对象。Session对象就像一个临时的工作区域,用于在应用程序和数据库之间传递信息。当我们在Session上进行操作时,这些操作...

    hibernate02:session对象、hql查询、在线查询也叫对象查询、离线查询

    在IT领域,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是繁琐的数据存取。本话题主要聚焦于`Hibernate02`,涵盖`Session`对象、HQL(Hibernate Query ...

    Hibernate_11session

    一级缓存默认开启,它是自动的,当对象在Session中被修改并提交后,这些变化会被立即写入数据库。二级缓存则需要手动配置和使用,可以提高数据读取性能。 六、Session的最佳实践 1. **短生命周期**:Session应保持...

    hibernate的session.flush

    `Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...

    JavaEE技术-自主学习.zip_hibernate_hibernate session _javaee映射.xml

    JavaEE技术是企业级应用程序开发的重要框架,而Hibernate作为其中的一员,是用于简化Java与数据库交互的ORM(对象关系映射)工具。本教程聚焦于使用Hibernate进行数据操作,并通过XML文件来配置数据库连接和对象-...

Global site tag (gtag.js) - Google Analytics