Hibernate的持久化环境
很久没有使用Hibernate了,现在要复习一下, 面试的话这个是必不可少的.
1.Hibernate Session.
session的概念大概是这样:
(1). Session是一块内存,里面存放了Persistent状态的对象, 也就是Persistent Context(持久化环境)
(2). Session里面有一组排着队等着执行的Sql,这些sql的目的本质上都是为了确保缓冲区(session级别的缓存,一级缓存)的内容和数据库保持一致.
关于Persistent Context,注意几点:
(1). 就是存放对象的一块缓存
(2). 你不能通过相关的API来访问它(它就是隐藏在背后的一个神秘人物)
(3). 很明显,一个Hibernate Session对应一个Persistent Context
(4). 对应的是一级缓存,不是可选的,是必须的,而且不能disable.
除了效率的提高(缓存), 缓存还可以给我们带来另外的好处:
(1) 自动脏数据检查.
来个例子:
package com.yxy.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.stat.Statistics;
import com.yxy.bean.Student;
public class HibernateStatTest {
public static void main(String[] args){
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
Statistics stat = sessionFactory.getStatistics();
Session session = sessionFactory.openSession();
session.getTransaction().begin();
stat.setStatisticsEnabled(true);
stat.clear();
Student student = (Student)session.load(Student.class, 1);
student.setName("Hello Hibernate !");
System.out.println(stat.getEntityLoadCount());
stat.setStatisticsEnabled(false);
session.getTransaction().commit();
session.close();
}
}
并没有调用update方法去更新,但是在事务提交之后是可以自动的将更新同步到数据库中的,控制台中也发出了相关的update语句
Hibernate:
/* update
com.yxy.bean.Student */ update
student
set
name=?,
sex=?,
register_date=?
where
id=?
原理很简单:
Hibernate会在session中保存一份对象最近从数据库中加载上来的快照(snapshot), 所以在写回到数据库中的时候(比如事务提交),会将当前的对象同快照进行对比,如果有变化,则将变化部分同步到数据库,要注意一点,自动脏数据检查只是针对persistent状态的对象,因为如果是detached状态的话,很明显sesson已经关闭,所以快照都不存在了,还对比什么啊.
得益于自动脏数据检查,Hibernate还有一个延迟写入策略(透明的交易层延迟写入) - Transparent transaction-level write-behind
例子如下:
package com.yxy.test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.stat.Statistics;
import com.yxy.bean.Student;
public class HibernateWriteBehindTest {
public static void main(String[] args){
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
Statistics stat = sessionFactory.getStatistics();
/*
* --------------------- Session 1 ---------------------------
*/
Session session = sessionFactory.openSession();
session.getTransaction().begin();
stat.setStatisticsEnabled(true);
stat.clear();
Student student = (Student)session.load(Student.class, 1);
student.setName("Hello Hibernate !");
System.out.println(stat.getEntityLoadCount());
stat.setStatisticsEnabled(false);
session.getTransaction().commit();
session.close();
/*
* 开启另外一个session, 这里的student是一个detached状态对象
*/
/*
* --------------------- Session 2 ---------------------------
*/
student.setName("Another Hibernate Session");
Session anotherSession = sessionFactory.openSession();
anotherSession.getTransaction().begin();
stat.setStatisticsEnabled(true);
stat.clear();
/*
* update student
*/
anotherSession.update(student);
/*
* 打印出flush的次数和修改对象的次数
*/
System.out.println("--------------- call update ----------------");
System.out.println(stat.getEntityUpdateCount());
System.out.println(stat.getFlushCount());
Student student2 = new Student();
student2.setName("Another Student");
student2.setRegisterDate(new Date(System.currentTimeMillis()));
student2.setSex("Man");
/*
* save student2
*/
anotherSession.save(student2);
/*
* 打印出新增对象个数等信息
*/
System.out.println("--------------- call save ----------------");
System.out.println(stat.getEntityInsertCount());
System.out.println(stat.getEntityUpdateCount());
System.out.println(stat.getFlushCount());
anotherSession.getTransaction().commit();
System.out.println("--------------- after commit ----------------");
System.out.println(stat.getEntityInsertCount());
System.out.println(stat.getEntityUpdateCount());
System.out.println(stat.getFlushCount());
stat.setStatisticsEnabled(false);
anotherSession.close();
}
}
通过console打印出来的部分信息可以看到:
--------------- call update ----------------
0
0
Hibernate:
select
hibernate_sequence.nextval
from
dual
--------------- call save ----------------
0
0
0
Hibernate:
/* insert com.yxy.bean.Student
*/ insert
into
student
(name, sex, register_date, id)
values
(?, ?, ?, ?)
Hibernate:
/* update
com.yxy.bean.Student */ update
student
set
name=?,
sex=?,
register_date=?
where
id=?
--------------- after commit ----------------
1
1
1
当调用update的时候,并不会马上同步到数据库中,同样的调用save方法时也不会马上生成insert并同步到数据库,而是等到事务commit,才会一次性flush. 其实这些没有马上执行的sql会保存在之前提高过的排着队的sql那个队列里面
延迟写入的好处:
(1) 可以减少数据库的负担,不会造成频繁的写数据库,当然也可以间接的提高并发性.
(2) 可以减少数据在网络上传输的开销.
但是也不是什么情况下都等到commit才会一股脑的将所有sql送给数据库去执行.比如说在中途要执行查询操作,这时Hibernate就会把之前的SQL送给数据库去执行了.因为要保证查询到的数据时最新的.
(关于这个问题,我不能试验出来啊,奇怪,看来书上说的还是有点不对,我使用的版本是Hibernate 3.2.0.ga)
在上述例子save student2之后调用:
List students = anotherSession.createSQLQuery("select * from student").list();
但是产生的统计信息没有变化. 这表示在发出查询操作后并没有把之前的sql交给数据库去处理.
关于Persistent Context的基本概念,就先到这啦.
分享到:
相关推荐
- **持久化操作**: - `delete(obj)`:删除一个实体。 - `merge`:合并一个实体。 - `getTranscation()`:获取事务处理接口。 - **查询操作**: - `createQuery`:创建一个HQL查询接口。 - `createCriteria`...
10. **实体状态管理**:持久化对象的瞬时态、持久态、游离态和脱管态的解释及其转换。 11. **JPA与Hibernate的关系**:简述Java Persistence API (JPA)与Hibernate之间的联系和差异。 这些知识点覆盖了Hibernate的...
**J2EE复习积累(六)-Hibernate4.2** 在J2EE开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了Java...通过持续学习和实践,开发者可以更好地利用Hibernate的特性,解决各种复杂的数据持久化问题。
《Hibernate达内五天复习笔记》是一份详细记录了Hibernate框架学习的资料,旨在帮助读者深入理解并掌握Hibernate这一强大的Java持久化框架。以下是笔记中的主要知识点: 1. **ORM原理**: - **对象持久化**:将...
2. **持久化类(Persistent Class)**: 实体类需要标记为`@Entity`,表示它是数据库表的映射。 3. **标识符(Identifier)**: 使用`@Id`注解定义主键,通常与自增列配合使用。 4. **数据访问对象(DAO)**: 负责与...
本学习资料集合了多个关于Hibernate的重要主题,包括对象关系映射的基础、持久化机制、查询语言以及不同类型的关联关系,旨在帮助学习者深入理解并掌握Hibernate的核心概念和技术。 1. **对象状态及一对多关联** ...
Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使开发者无需关注底层SQL语句,就能实现对数据库的数据操作。本复习旨在深入理解Hibernate的核心概念、配置及常用API,帮助开发者提高...
3. 使用Hibernate完成持久化操作的准备和步骤: - 准备:配置Hibernate环境,包括hibernate.cfg.xml配置文件、实体类的编写、映射文件的创建。 - 步骤:创建SessionFactory,打开Session,开始事务,执行持久化...
2. **持久化状态(Persistent)**:当Hibernate的Session管理一个对象,并且对象已经与数据库中的一个记录相关联时,对象处于持久化状态。在这一状态下,对象的任何改变都会在Session被提交时自动保存到数据库,而...
1. **Hibernate简介**:Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互,通过将Java对象与数据库表进行映射,实现了对象的持久化。 2. **配置Hibernate**:在Demo中,我们需要...
4. **持久化操作**:Hibernate提供了增删改查(CRUD)操作,如Session接口的save()、update()、delete()和get()方法,以及Criteria API和HQL(Hibernate Query Language)用于复杂的查询。 5. **事务管理**:学习...
- Hibernate作为持久化层,处理数据库的CRUD操作,通过ORM映射实现对象与数据库表的对应。 7. **Struts2的角色**: - Struts2用于控制层,接收和处理用户请求,通过Action转发到对应的视图。 8. **对象调用流程*...
- 在J2EE环境中,Hibernate可以替代CMP(容器管理持久性)处理数据持久化。 - Hibernate的核心接口包括Session、SessionFactory、Transaction、Query和Configuration,它们覆盖了对象的存取、事务管理和配置等关键...
本复习资料主要关注数据持久化、隐式与匿名类型以及匿名函数的使用,这些都是在使用EF进行数据库操作时的关键概念。 数据持久化是软件工程中的一个重要概念,指的是程序中的数据能够保存在持久性存储中,即使应用...
【广州巨匠培训 Hibernate培训课件】主要涵盖了Hibernate这一开源对象关系映射(ORM)框架的基础知识,旨在帮助学员理解并掌握如何使用Hibernate进行数据持久化操作。Hibernate简化了Java应用程序与数据库之间的交互...
1. **Hibernate简介**:Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互,通过将Java对象与数据库表进行映射,实现了对象的持久化。 2. **配置文件**:在Hibernate中,`...
- **持久化操作**:在 Hibernate 中,会话接口提供了 `delete(obj)`(删除实体)、`merge(obj)`(合并实体)和 `getTransaction()`(获取事务处理接口)等方法。 - **HQL 和 Criteria API**:`createQuery()` 用于...
这些库提供了从持久化对象到数据库表的映射,查询语言HQL的执行,以及事务管理和缓存管理等功能。学习过程中,理解这些库的作用和用法至关重要,它们是构建基于Hibernate的应用程序的基础。 最后,“slf4j”是...