数据的保存,更新和删除:
1、Session.save()方法:
Session.save()方法用于实体对象的持久化保存,也就是说当执行session.save()方法时会生成对应的insert SQL语句,完成数据的保存。如下面的代码:
User user=new User();
user.setName(“zx”);
Transaction tx=session.beginTransaction();
session.save(user);
tx.commit();
当执行到session.save()方法时,Hibernate并不会马上生成insert SQL语句来进行数据的保存,而是当稍后清理session的缓存时才有可能执行insert SQL语句,那么session.save()方法到底会执行哪些步骤呢?请看进行了如下总结:
一、 在session的内部缓存中寻找保存对象,如果找到了,则认为此数据已经保存(曾经执行过insert操作),实体对象已经处于persistent状态,直接返回。此时即使数据相比之前的状态发生了变化,也将在事务提交时由脏数据检查来判定是否需要执行update操作。
二、 如果实体对象实现了lifecycle接口,那么将执行待保存对象的onSave()方法。
三、 如果实体对象实现了Validatable接口,那么将会执行相应的validate()方法。
四、 如果存在拦截器对象,那么将会执行Interceptor.onSave()方法。
五、 构造insert SQL语句完成数据保存。
六、 数据保存成功后,设定实体对象的id为插入记录的id。
七、 将保存后的实体对象纳入Hibernate的内部缓存(一级缓存)。注意Hibernate不会把保存后的实体对象纳入二级缓存,因为刚刚保存过的实体对象很可能在之后被修改,缓存的频繁更新以及带来的同步问题代价,超出了缓存该对象所带来的收益。
八、 最后如果该对象有关联对象,那么将会递归处理该级联对象。
1、 Session.update()方法:
前面我在实体对象状态转化部分曾经讲过,session.update()方法能够将一个处于游离状态的对象,重新纳入Hibernate的内部缓存,变成持久化对象。如下面的代码:
Configuration cfg = new Configuration();
SessionFactory sf=cfg. configure().buildSessionFactory();
Customer customer=new Customer(“zx”,27,images);//customer对象处于自由状态
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
session.save(customer);//保存后customer对象处于持久化状态
session.flush();//清空缓存后customer对象处于游离状态
tx.commit();
session.close();
Session session2=sf.openSession();
Transaction tx2=session2.beginTransaction();
session2.update(customer);//通过调用update()方法将游离状态的customer对象,再次转化成持久化状态
session2.delete(customer);//调用delete()方法后,当清空缓存时,会将customer对象移出缓存,同时会在数据库中生成delete事务,来删除customer对象对应的数据记录
tx.commit();
session.close();
那么这个方法到底执行了哪些步骤呢?它会按照下面的步骤进行操作:
一、 首先会在缓存中寻找需要更新的实体对象,如果找到就立刻返回,从这里我们可以看出如果对一个已经处于persistent的实体对象执行update()方法,将不会产生任何作用。
二、 然后当提交事务进行缓存清理时,将会通过脏数据检查,确定变化的属性,然后生成update SQL语句完成数据的更新。
这里有一个问题我们要强调一下,那就是只要通过update()方法将一个游离对象与session相关联,那么不论这个游离的实体对象的属性是否发生改变,都会执行update SQL语句。如下面的代码:
Transaction tx=session.beginTransaction();
session.update(customer);
tx.commit();
session.close();
在这段代码中并没有修改customer对象的任何属性值,但是也会执行一个update SQL语句,如果你希望在没有改变实体对象属性值的情况下不去执行update SQL语句,那么你要开启实体对象<class>元素的”select-before-update”属性,将其设置为”true”,这个属性默认为”false”。如下进行配置:
<class name=”com.neusoft.entity.Customer” table=”customer” select-before-update=”true”>
如果启用了这个属性配置,那么在清理session缓存之前,会首先执行类似如下的一条SQL语句:
Select * from customer where id='1';
查询处所有的customer实体在数据库中对应的属性值,然后逐条与缓存中属性值进行比较,如果发生了改变,那么将会生成update操作进行数据更新,如果没有发生改变那么将不会进行update操作。要跟据实际需求情况来决定是否开启这个选项,如果实体对象的属性不会经常发生改变,那么就应该开启这个选项,以免执行多余的update操作。如果实体对象的属性会经常发生改变,那么就没必要开启这个选项,以免在执行update操作前再执行多余的select语句。
注:(1)、当执行对一个游离实体对象执行session.update()操作时,如果在数据库中不存在这个实体对应的纪录,那么这个操作将会抛出异常。
(2)、当执行session.update()方法将一个游离对象与session关联时,如果此时在缓存中已经存在了与该实体对象具有相同OID的持久化对象,那么这个方法会抛出异常。如下面代码:
Customer customer1=new Customer(“1”,“zx”,27,images);
Session session1=sf.openSession();
Transaction tx=session1.beginTransaction();
session.save(customer1);
session.flush();
tx.commit();
session1.close();
Session session2=sf.openSession();
Transaction tx2=session2.beginTransaction();
Customer othercustomer=(Customer)session2.load(Customer.class,”1”);
session2.update(customer1)
tx2.commit();
session2.close();
当再次将游离对象customer1与session2关联时,此时因为load()操作,在缓存已经加载了一个和customer1具有相同OID的othercustomer对象,此时由于Hibernate缓存的对象缓存机制不允许把OID相同的对象缓存,所以会抛出异常。
2、 Session.saveOrUpdate():
这个方法包含了save()方法和update()方法的特点,如果传入该方法的是一个游离对象,那么这个方法就会执行update操作,如果传入该方法的是一个临时对象,那么这个方法就会执行insert操作。这个方法幕后的工作原理如下:
a) 首先在缓存寻找,如果找到待保存的操作就直接返回。
b) 如果实体实现了拦截方法,那么就执行isUnsaved()方法,判断实体对象状态。
c) 如果实体处于临时状态就执行save(),如果实体处于游离状态那么就执行update()。
这里存在一个问题,那就是Hibernate是怎样判断一个实体是处于游离态还是临时状态的?如果实体满足下面的一个条件,就认为这个实体处于临时状态。
.Java对象的OID值为null。
.如果Java对象具有version属性(将在并发加锁部分讲解)且为null。
.如果实体的<id>设置了属性unsaved-value,而且OID值与unsaved-value值相等。
.如果实体的version属性设置了unsaved-value,并且version属性的值与unsaved-value值相等。
.如果实体实现了Interceptor,而且Interceptor.isUnsaved()方法返回true。
满足这些条件中的一个,这个实体就被认为是临时对象。
3、 Session.delete():
delete()方法用于从数据库中删除一个或一批实体所对应的数据,如果传入的对象是持久化对象,么当清理缓存时,就会执行delete操作。如果传入的是游离对象,那么首先会使该对象与session相关联,然后当清理缓存时,再执行delete操作。看如下代码:
Session session=sessionFactory().openSession();
Transaction tx=session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class,”1”);
session.delete(customer);//计划执行一条delete语句
tx.commit();//清理缓存,执行一条delete语句
session.close();//关闭session,这时将会把customer对象从缓存中删除。
如果上面的代码中的customer对象是一个游离对象,那么当执行session.delete()方法时,会首先将游离的customer对象与session相关联,然后再清理缓存时,再执行delete操作。如果你想一次删除多条数据,那么可以采用一个重载的delete()方法:delete(“from Customer c where c.id>'8' ”);这个方法可以删除符合条件的所有数据。
详细出处参考:http://www.jb51.net/article/16475.htm
分享到:
相关推荐
在本篇文章中,我们将深入探讨JSP中使用Hibernate进行数据保存操作的原理,特别是`session.save()`方法的工作机制。 当我们在JSP页面或者相关的Java后端代码中调用`session.save()`方法时,Hibernate并不会立即执行...
### JSP Hibernate 数据保存操作的原理 #### 一、概述 在Java开发中,Hibernate作为一款流行的ORM(Object-Relational Mapping)框架,为开发者提供了高效便捷的方式将Java对象映射到关系型数据库中的表,并支持对...
4. **Session接口**:是Hibernate的主要工作接口,负责对象的持久化操作,如保存、更新、删除和查询。 **三、Hibernate工作流程** 1. **初始化SessionFactory**:加载配置文件,创建SessionFactory实例,这是线程...
- **简化数据访问层**:Hibernate封装了JDBC,减少了很多重复的数据库操作代码。 - **ORM(对象关系映射)**:提供了对象和数据库表之间的映射,使开发者可以使用面向对象的方式来操作数据库。 - **反射机制**:利用...
### Hibernate原理深度解析 #### Hibernate为何重要? Hibernate作为一款开源的对象关系映射(ORM)框架,在Java开发领域占据着举足轻重的地位。其重要性体现在以下几个方面: 1. **资源管理**:Hibernate通过...
### Hibernate 体系结构与工作原理 #### 一、概述 Hibernate 是一款开源的对象关系映射(Object Relational Mapping,简称 ORM)框架,它为 Java 应用程序提供了一种将对象模型与数据库模型进行映射的方式,使得...
**Hibernate4基本实现原理** Hibernate 是一款流行的 Java ORM(对象关系映射)框架,它允许开发者将数据库操作与 Java 对象交互,简化了数据库应用程序的开发。本文将深入解析 Hibernate4 的基本实现流程,帮助...
`SessionFactory` 保存了所有关于数据库的元数据和配置信息,确保在整个应用生命周期中只需要创建一次。 `Session` 是 Hibernate 的工作单元,它提供了与数据库交互的接口。开发者可以通过 `Session` 进行 CRUD...
《Hibernate数据访问技术大全》是一本深入探讨Java领域中Hibernate框架的数据访问技术的权威指南。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)工具,它极大地简化了数据库操作,使得开发人员能够以面向...
通过Hibernate的Session接口,开发者可以方便地进行对象的保存、查询、更新和删除。 5. **Spring的作用**: - Spring不仅管理Service层和服务层的依赖,还提供了AOP和事务管理功能。它可以集成Struts和Hibernate,...
### Hibernate工作原理详解 #### 一、概述 Hibernate 是一款开放源代码的 ORM(Object Relational Mapping)框架,它能够将 Java 类与数据库表建立映射关系,从而简化了持久层的操作。通过 Hibernate,开发人员...
#### Hibernate Blob 数据处理原理 在 Hibernate 中,Blob 类型的字段通常被映射为 `java.sql.Blob` 类型。该类提供了对数据库中 Blob 数据的操作接口。对于不同的数据库管理系统(DBMS)如 Oracle、MySQL 或 MSSQL...
下面将详细解释Hibernate的工作原理,以及为何在开发中需要使用它。 **工作原理:** 1. **读取并解析配置文件**:Hibernate首先读取hibernate.cfg.xml配置文件,从中获取数据库连接信息、方言设置等关键配置。 2....
对象持久化(Persistence)是指将内存中的对象数据保存到持久化存储设备上,如硬盘。这主要是为了解决内存的不稳定性和容量限制问题,并满足业务数据共享、大规模数据检索和数据管理的需求。 在企业级应用中,对象...
本篇文章将深入探讨使用Hibernate进行多对多数据表操作,特别是插入操作的细节。 在数据库设计中,多对多(Many-to-Many)关系是指一个实体可以与多个其他实体关联,反之亦然。例如,学生和课程之间的关系就是典型...
2. **Session接口**:它是Hibernate的主要工作接口,负责对象的加载、保存、更新和删除等操作,提供了事务管理和缓存机制。 3. **Criteria查询**:提供了一种动态构建SQL查询的方式,无需编写硬编码的SQL语句,增强...
通过 ORM,开发者可以避免直接编写 SQL 语句,而是通过对象的创建、更新和查询来操作数据,简化了数据访问层的代码。 Hibernate 的核心 API 包括几个主要接口,它们是 Session、SessionFactory、Query 和 Criteria ...
本篇将详细探讨“Hibernate插入数据”的相关知识点,结合学习心得,深入理解并掌握其核心原理与实践技巧。 首先,Hibernate通过对象关系映射(ORM)技术,将数据库表与Java类关联起来,使得数据库操作可以通过对象...
它封装了常见的Hibernate操作,如保存、更新、删除和查询。在Spring配置文件中,我们可以定义一个`HibernateTemplate`bean,并将其与SessionFactory关联。 4. **定义DAO层**: 数据访问对象(DAO)层负责与数据库的...