之前只是简单的了解像flush、commit、evict这些方法,而且对实际的执行过程也缺乏了解,在做一些项目的时候也因此导致出现一些错误。通过查阅一些资料后才知道原来是怎么一回事,以下是自己整理的一点东西,给有需要的人看看。
之前使用hibernate框架的时候经常会忘记了在我们的应用程序与数据库之间还隔了一Hibernate,只是简单的认为通过session对数据库操作就是高一层JDBC的封装而已,但Hibernate在为我们提供持久化服务的同时,其实它改变了我们对数据库的操作方式,这种方式使我们不再像是JDBC一样直接对数据库操作,而是有着很多的不同,如果没有正视这一点,在应用Hibernate的时候往往会出现一些不好的结果。
有什么不同?
最大的不同就是Hibernate在我们的应用程序与数据库之间增加了一个缓存区。每Session是通过一些映射和集合来维护所有与该Session建立了关联的对象实体以及对这些对象实体所进行的操作
主要映射与集合:
entityEntries:保存与Session建立了关联的对象实体的映射,包含了对象实体的状态信
息。
insertions:所有的插入操作集合,在一次事务中所有的插入操作都会被记录进来。
deletions:所有删除操作集合,在一次事务中所有删除操作都会被记录进来。
updates:所有更新操作集合,在一次事务中所有更新操作都会被记录进来。
我们平时使用session中的方法对数据库进行操作的时候,实际的执行过程与上面的的缓存的映射、集合有很大关系。
刚学Hibernate的时候我错误的认为:
session.save(obj);
错误认为上面这句代码执行的时候就会将对象实体进行缓存并保存到数据库,但Hibernate并未将这个对象实际的写入数据库中,而仅仅是将obj这个对象放入entityEntries(因为此时obj已经与缓存建立了关联了),由于现在是要对obj对象进行插入操作,Session还要在insertions中登记这个插入行为,在真正需要将缓存中的数据flush(事务提交的时候会调用此方法)入数据库时才执行先前登记的所有行为(有多个数据库操作,会分别一起先登记到对应的操作集合)。
理解了上面说实际执行过程之后,看一个简单的例子:
Session s = HibernateSessionFactory.openSession(); Obj obj = new Obj(); Transaction tx = s.beginTransaction(); s.save(obj); s.evict(obj); tx.commit(); s.close();
如果觉得上面的代码没有错误那么说明也没能理解好hibernate对数据库操作的实际过程。
以上代码中的s.evict(obj)将obj对象实体从session缓存中清除,会从entityEntries中将obj这个
对象移出。
事务提交时,需要将所有缓存中的对象实体flush入数据库,这个时候obj不在entityEntries中是没有什么关系的,因为在执行insert的行为时只需要访问insertions集合就足够了,所以此时不会有任何的异常。但执行完插入后异常就出现了,在插入完成后需要entityEntries中obj的标记为已存在数据库中,但obj已经不存在于entityEntries中,此时就会出现异常。
学习中还有一个比较容易模糊的是:flush
session中的flush主要做两件事:
1、清理缓存
2、强制数据库与缓存中的对象实体进行同步,保证数据的一致性
要注意的是在进行flush的时候,是有顺序的:hibernate会将之前已经登记到insertions这些操作集合的所有行为按照insert、update、delete的顺序提交操作的,但它也并不会向数据库提交事务(未持久化到数据库,还可以rollback),也就是数据库中的数据还没有变动。
看个例子:
Session s = HibernateSessionFactory.openSession(); User user1 = new User(); user1.setU_id("1");//这里u_id是主键 s.save(user1); //保存对象 user1.setU_id("2");//更改主键 s.update(User1);//更新对象 User user2 = new User(); user2.setU_id("1"); s.save(user2); s.flush();
上面的代码会产生主键冲突,这就跟上面说的flush提交操作的顺序有关。
虽然s.save(user2)写在了s.update(user1)后面,但flush提交操作的时候会按顺序先将登记在insertions集合里的操作行为都提交执行后再提交updates集合里的。所以在执行s.save(user1)之后就执行了s.save(user2),从而出现主键冲突。
在使用hibernate的时候,单纯简单的了解的话有可能会带来一些不确定的情况,通过了解多一点的实际操作过程与内部机制,会帮助我们写出更好的代码,所以我还是强调:做一个较真的技术人。
相关推荐
- **作用**: `Session` 是 Hibernate 中的核心接口之一,它负责执行所有与数据库交互的操作,如保存、更新、查询和删除等。 - **生命周期**: 每个 `Session` 实例都有自己的生命周期,通常在一个事务或业务逻辑单元...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过Java对象来操作数据库,极大地简化了数据库操作。金仓数据库,又称为Kingbase,是一款国产的高性能、高可靠性的关系型数据库管理...
在实际项目中,开发者可能会进一步利用Hibernate的逆向工程功能,自动生成实体类和映射文件,以便更方便地进行数据库操作。这些实体类可以直接映射到数据库表,使得开发者可以专注于业务逻辑,而不用过多关注底层SQL...
**标题与描述解析** 标题"Hibernate实例 oracel数据库"表明我们将探讨如何使用ORM框架Hibernate与Oracle...通过这个实例,开发者可以深入了解Hibernate在实际项目中的应用,同时提升对数据库操作和单元测试的理解。
如果在操作过程中发生错误,可以调用`Transaction.rollback()`回滚事务,撤销所有变更。需要注意的是,提交或回滚后,事务就结束了。 7. **关闭Session**:事务处理完毕后,一定要记得关闭`Session`,释放相关的...
Session 是 Hibernate 提供的主要接口,用于执行数据库操作,如 CRUD(Create, Read, Update, Delete)。Session 实例通过调用相应的方法,如 saveOrUpdate、delete 和 createQuery,可以实现对象的持久化、删除和...
**基于Hibernate的简单数据库实现** Hibernate是一个开源的对象关系映射(ORM)框架...在实际项目中,可以根据需求选择合适的方式进行数据库操作,同时利用Hibernate的高级特性,如缓存、查询优化等,来提升应用性能。
Session是Hibernate中的核心接口,它充当了应用程序和数据库之间的桥梁,负责对象的持久化操作,如保存、更新、删除和查询等。Session通常在一个事务中打开并在事务结束时关闭,以确保数据的一致性和完整性。 然而...
1. Session: Hibernate的核心接口,负责与数据库的交互,提供了事务管理、缓存管理以及持久化对象的创建、查询、更新和删除等操作。 2. Configuration:负责初始化Hibernate环境,加载配置文件,建立SessionFactory...
Action类通常包含处理业务逻辑的方法,这些方法会调用Hibernate的相关API来执行对MySQL数据库的CRUD(创建、读取、更新、删除)操作。例如,创建新记录时,会使用SessionFactory创建Session,然后通过Session的save...
总的来说,`Hibernate Session`负责对象的持久化操作,而`Transaction`则处理数据库事务的开始、提交、回滚等操作。理解并正确使用这两个接口是进行高效、可靠的Hibernate编程的关键。在实际应用中,应根据业务需求...
在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...
标题"Hibernate数据库操作实例.zip"表明这是一个关于使用Hibernate框架进行数据库操作的实际案例。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发人员使用面向对象的方式来处理数据库交互,而无需...
在Java的持久化框架中,Hibernate是一个非常重要的存在,它为开发者提供了强大的对象关系映射(ORM)功能,简化了数据库操作。本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个...
在IT行业中,数据库操作是应用程序开发的核心部分,无论是Web应用还是桌面应用,都需要与数据库进行交互来存储和检索数据。...在实际项目中,开发者通常根据需求和项目规模来选择合适的数据库操作方式。
通过Hibernate,我们可以将数据库中的表与Java类进行映射,从而实现对数据库的操作,而无需编写大量的SQL语句。这极大地提高了开发效率,降低了代码的复杂性。 在Hibernate中,`SessionFactory`是核心组件之一,它...
然而,在实际开发中,我们往往需要根据项目需求对其进行定制,例如添加事务管理、异常处理、日志记录等功能,这就涉及到了对`Session`的封装。 在提供的`HibernateSessionWrapper.java`文件中,我们可以预期它实现...
在实际开发中,为了满足特定需求,有时我们需要对Hibernate的默认Session行为进行扩展或覆盖。例如,可能需要添加日志记录、事务控制、性能优化等功能。这就需要我们创建一个自定义的Session工厂(SessionFactory)...
5. **操作关联**:在代码中,可以通过Hibernate的Session接口进行添加、删除、查询等操作,以维护多对多关系。 **数据库代码** 数据库代码部分可能包括创建相关表和中间表的SQL语句,以及填充数据的INSERT语句。...