`
spring-china
  • 浏览: 50635 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

复习 - Hibernate的持久化环境

阅读更多

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的基本概念,就先到这啦.

 

 

 

 

 

 

 

 

 

 

 

0
1
分享到:
评论

相关推荐

    J2EE考试复习试题-struts2-spring-hibernate(答案整合完毕).doc

    - **持久化操作**: - `delete(obj)`:删除一个实体。 - `merge`:合并一个实体。 - `getTranscation()`:获取事务处理接口。 - **查询操作**: - `createQuery`:创建一个HQL查询接口。 - `createCriteria`...

    SVSE-S3冲刺题-Hibernate笔试题

    10. **实体状态管理**:持久化对象的瞬时态、持久态、游离态和脱管态的解释及其转换。 11. **JPA与Hibernate的关系**:简述Java Persistence API (JPA)与Hibernate之间的联系和差异。 这些知识点覆盖了Hibernate的...

    J2EE复习积累(六)-Hibernate4.2

    **J2EE复习积累(六)-Hibernate4.2** 在J2EE开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了Java...通过持续学习和实践,开发者可以更好地利用Hibernate的特性,解决各种复杂的数据持久化问题。

    hibernate达内五天复习笔记.pdf

    《Hibernate达内五天复习笔记》是一份详细记录了Hibernate框架学习的资料,旨在帮助读者深入理解并掌握Hibernate这一强大的Java持久化框架。以下是笔记中的主要知识点: 1. **ORM原理**: - **对象持久化**:将...

    hibernate+spring复习大纲

    2. **持久化类(Persistent Class)**: 实体类需要标记为`@Entity`,表示它是数据库表的映射。 3. **标识符(Identifier)**: 使用`@Id`注解定义主键,通常与自增列配合使用。 4. **数据访问对象(DAO)**: 负责与...

    北大青鸟Hibernate学习资料

    本学习资料集合了多个关于Hibernate的重要主题,包括对象关系映射的基础、持久化机制、查询语言以及不同类型的关联关系,旨在帮助学习者深入理解并掌握Hibernate的核心概念和技术。 1. **对象状态及一对多关联** ...

    复习hibernate

    Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使开发者无需关注底层SQL语句,就能实现对数据库的数据操作。本复习旨在深入理解Hibernate的核心概念、配置及常用API,帮助开发者提高...

    Hibernate练习题

    3. 使用Hibernate完成持久化操作的准备和步骤: - 准备:配置Hibernate环境,包括hibernate.cfg.xml配置文件、实体类的编写、映射文件的创建。 - 步骤:创建SessionFactory,打开Session,开始事务,执行持久化...

    Hibernate复习题1含答案要点.doc

    2. **持久化状态(Persistent)**:当Hibernate的Session管理一个对象,并且对象已经与数据库中的一个记录相关联时,对象处于持久化状态。在这一状态下,对象的任何改变都会在Session被提交时自动保存到数据库,而...

    Hibernate4.1.1的Demo实例

    1. **Hibernate简介**:Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互,通过将Java对象与数据库表进行映射,实现了对象的持久化。 2. **配置Hibernate**:在Demo中,我们需要...

    传智播客2016hibernate框架学习笔记

    4. **持久化操作**:Hibernate提供了增删改查(CRUD)操作,如Session接口的save()、update()、delete()和get()方法,以及Criteria API和HQL(Hibernate Query Language)用于复杂的查询。 5. **事务管理**:学习...

    java培训个人总结.pdf

    - Hibernate作为持久化层,处理数据库的CRUD操作,通过ORM映射实现对象与数据库表的对应。 7. **Struts2的角色**: - Struts2用于控制层,接收和处理用户请求,通过Action转发到对应的视图。 8. **对象调用流程*...

    【实习报告】计算机专业顶岗实习总结三篇.doc

    - 在J2EE环境中,Hibernate可以替代CMP(容器管理持久性)处理数据持久化。 - Hibernate的核心接口包括Session、SessionFactory、Transaction、Query和Configuration,它们覆盖了对象的存取、事务管理和配置等关键...

    EntityFramework数据持久化复习资料2、隐式与匿名类型同匿名函数的使用,包含DPF与完整的示例,下载后可直接使用测试

    本复习资料主要关注数据持久化、隐式与匿名类型以及匿名函数的使用,这些都是在使用EF进行数据库操作时的关键概念。 数据持久化是软件工程中的一个重要概念,指的是程序中的数据能够保存在持久性存储中,即使应用...

    广州巨匠培训][Hibernate培训课件

    【广州巨匠培训 Hibernate培训课件】主要涵盖了Hibernate这一开源对象关系映射(ORM)框架的基础知识,旨在帮助学员理解并掌握如何使用Hibernate进行数据持久化操作。Hibernate简化了Java应用程序与数据库之间的交互...

    Hibernate_使用示例代码

    1. **Hibernate简介**:Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互,通过将Java对象与数据库表进行映射,实现了对象的持久化。 2. **配置文件**:在Hibernate中,`...

    ssh期末复习题.doc

    - **持久化操作**:在 Hibernate 中,会话接口提供了 `delete(obj)`(删除实体)、`merge(obj)`(合并实体)和 `getTransaction()`(获取事务处理接口)等方法。 - **HQL 和 Criteria API**:`createQuery()` 用于...

    hibernate学习必用

    这些库提供了从持久化对象到数据库表的映射,查询语言HQL的执行,以及事务管理和缓存管理等功能。学习过程中,理解这些库的作用和用法至关重要,它们是构建基于Hibernate的应用程序的基础。 最后,“slf4j”是...

Global site tag (gtag.js) - Google Analytics