Hibernate框架--对象的状态,缓存, 映射

回顾Hibernate第二天:

1.  一对多与多对一

2. 多对多

3. inverse/cascade

4. 关联关系的维护

一对多:

<set name="映射的集合属性" table="(可选)集合属性对应的外键表">

<key column="外键表的,外键字段" />

<one-to-many class="集合元素的类型" />

</set>

多对一:

<many-to-one name="对象属性" class="对象类型" column="外键字段字段" />

多对多

<set name="" table="">

<key column="" />

<many-to-many column="" class="">

</set>

目标:

第1部分: 对象的状态:

第2部分:缓存

1) 一级缓存

2) 相关知识

----懒加载---

第3部分:映射

一对一映射

组件映射

继承映射

一、对象的状态

举例: User   user   = new User();

Hibernate中对象的状态: 临时/瞬时状态、持久化状态、游离状态。

1. 临时状态

  特点:

  直接new出来的对象;

  不处于session的管理;

  数据库中没有对象的记录;

1. 持久化状态

  当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态。

  处于持久化状态的对象,当对对象属性进行更改的时候,会反映到数据库中!

  特点:

  处于session的管理;

  数据库中有对应的记录;

3. 游离状态

  特点:

不处于session的管理;

数据库中有对应的记录

Session关闭后,对象的状态;

对象状态的转换 

public class User {

    private int userId;
    private String userName;
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Override
    public String toString() {
        return "User [userId=" + userId + ", userName=" + userName + "]";
    }

}
<hibernate-mapping package="cn.itcast.a_status">

    <class name="User" table="t_user">
        <id name="userId" column="id">
            <generator class="native"></generator>
        </id>
        <property name="userName"></property>
    </class>

</hibernate-mapping>
public class App1_status {

    private static SessionFactory sf;
    static {
        sf = new Configuration()
            .configure()
            .addClass(User.class)   // 测试时候使用
            .buildSessionFactory();
    }

    //1. 对象状态的转换
    @Test
    public void testSaveSet() throws Exception {
        Session session = sf.openSession();
        session.beginTransaction();

        // 创建对象                        【临时状态】
//        User user = new User();
//        user.setUserName("Jack22222");
        // 保存                            【持久化状态】
//        session.save(user);
//        user.setUserName("Jack333333");  // 会反映到数据库

        // 查询
        User user = (User) session.get(User.class, 5);
        user.setUserName("Tomcat");// hibernate会自动与数据库匹配(一级缓存),如果一样就更新数据库

        session.getTransaction().commit();
        session.close();

        user.setUserName("Jack444444444");
        // 打印                            【游离状态】
        System.out.println(user.getUserId());
        System.out.println(user.getUserName());
    }

    @Test
    public void bak() throws Exception {
        Session session = sf.openSession();
        session.beginTransaction();
        session.getTransaction().commit();
        session.close();
    }
}

二、一级缓存

为什么要用缓存?

目的:减少对数据库的访问次数!从而提升hibernate的执行效率!

Hibernate中缓存分类:

一级缓存

二级缓存

ü  概念

1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数!  只在session范围有效! Session关闭,一级缓存失效!

2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。

3)Session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。

特点:

         只在(当前)session范围有效,作用时间短,效果不是特别明显!

         在短时间内多次操作数据库,效果比较明显!

 

 

ü  缓存相关几个方法的作用

    session.flush();       让一级缓存与数据库同步

session.evict(arg0);    清空一级缓存中指定的对象

session.clear();       清空一级缓存中缓存的所有对象

在什么情况用上面方法?

批量操作使用使用:

Session.flush();   // 先与数据库同步

Session.clear();   // 再清空一级缓存内容

ü  面试题1: 不同的session是否会共享缓存数据?  不会。

User1  u1 = Session1.get(User.class,1);   把u1对象放入session1的缓存

Session2.update(u1);     把u1放入session2的缓存

U1.setName(‘new Name’);

如果生成2条update sql, 说明不同的session使用不同的缓存区,不能共享。

ü  面试题2: list与iterator查询的区别?

list()

一次把所有的记录都查询出来,

会放入缓存,但不会从缓存中获取数据

Iterator

N+1查询; N表示所有的记录总数

即会先发送一条语句查询所有记录的主键(1),

再根据每一个主键再去数据库查询(N)!

会放入缓存,也会从缓存中取数据!

public class App2_cache {

    private static SessionFactory sf;
    static {
        sf = new Configuration()
            .configure()
            .addClass(User.class)   // 测试时候使用
            .buildSessionFactory();
    }

    @Test
    public void testCache() throws Exception {
        Session session = sf.openSession();
        session.beginTransaction();
        User user = null;
        // 查询
        user = (User) session.get(User.class, 5);// 先检查缓存中是否有数据,如果有不查询数据库,直接从缓存中获取
        user = (User) session.get(User.class, 5);// 这一句就不再向数据库发送查询命令了,减少了与数据库的交互。

        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void flush() throws Exception {
        Session session = sf.openSession();
        session.beginTransaction();

        User user = null;
        user = (User) session.get(User.class, 5);
        user.setUserName("Jack");
        // 缓存数据与数据库同步
        session.flush();

        user.setUserName("Jack_new");

        session.getTransaction().commit();  // session.flush();
        session.close();
    }

    @Test
    public void clear() throws Exception {
        Session session = sf.openSession();
        session.beginTransaction();

        User user = null;
        // 查询
        user = (User) session.get(User.class, 5);
        // 清空缓存内容
//        session.clear(); // 清空所有
        session.evict(user);// 清除指定

        user = (User) session.get(User.class, 5);

        session.getTransaction().commit();  // session.flush();
        session.close();
    }

    @Test
    public void sessionTest() throws Exception {
        Session session1 = sf.openSession();
        session1.beginTransaction();
        Session session2 = sf.openSession();
        session2.beginTransaction();

        // user放入session1的缓存区
        User user = (User) session1.get(User.class, 1);
        // user放入session2的缓存区
        session2.update(user);

        // 修改对象
        user.setUserName("New Name");  // 2条update

        session1.getTransaction().commit();  // session1.flush();
        session1.close();
        session2.getTransaction().commit();  // session2.flush();
        session2.close();
    }
}
时间: 2024-10-13 00:58:32

Hibernate框架--对象的状态,缓存, 映射的相关文章

(09)Hibernate中对象的状态

Hibernate中对象的状态: 临时/瞬时状态.持久化状态.游离状态. Hibernate中的对象状态 序号 状态 特点 1 临时状态 a. 直接new出来的对象; [内存] b. 不处于session的管理;[session] c. 数据库中没有对象的记录;[数据库] 2 持久化状态 a. 处于session的管理; b. 数据库中有对应的记录; 说明:当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态.          

Hibernate学习笔记(二) — 探索 hibernate 中对象的状态

一.hibernate中对象的状态有三种: 临时.游离和持久化,三种状态转化的方法都是通过session来调用的 什么是持久化? 通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存) 二.三种状态的相互转换 session方法 session.save():该方法可以把一个对象从临时装填转换成持久化状态 session.get():从数据库中根据主键提取出一个对象,该对象就是一个持久化状态的对象 session.update():把一

hibernate框架学习之一级缓存

l缓存是存储数据的临时空间,减少从数据库中查询数据的次数 lHibernate中提供有两种缓存机制 ?一级缓存(Hibernate自身携带) ?二级缓存(使用外部技术) lHibernate的一级缓存即Hibernate操作数据时所对应的临时数据存储区域,这个区域是绑定Session对象的,也就是说每开启一个Session对象,就会产生对应的一级缓存空间,当Session对象关闭时,该空间内的数据,也就是其中保存的PO对象,会转化为DO对象. lHibernate的一级缓存是Session级别的

Hibernate持久化对象的状态

1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态, 暂时状态, 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到还有一个状态 . 2. 暂时状态(Transient) : 1). 在使用代理主键的情况下 , OID 通常为 null 2). 不处于 Session 的缓存中 3). 在数据库中没有相应的记录 3. 持久化状态(也叫"托管" )( Persist) 1). OID 不为 null 2). 位于 S

(转)Hibernate框架基础——一对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即集合元素是普通类型).现在从本文开始我们就要介绍实体类型的集合(即集合元素是另一个实体)了. 一对多关联关系映射 我们还是以一个活生生的例子来详解一对多关联关系映射吧!就以部门和员工的关系为例. 单向关联:仅仅建立从Employee到Department的多对一关联,即仅仅在Employee类中定义

Hibernate 持久化对象和一级缓存

关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识OID,没有纳入Session的管理. 2.Persistent持久态:持久化对象有唯一标识OID,已经纳入到Session的管理,另外,持久化具有自动更新数据库的特点 3.Detached脱管态:持久化对象有唯一标识OID,没有纳入到Session管理. 下面给出一段代码来区分这三种状态: 1 /

Hibernate PO对象的状态

Hibernate的PO对象有三种状态:临时状态(又称临时态).持久状态(又称为持久态)和脱管状态(又称为脱管态.游离态).处理持久态的对象也称为PO,临时对象和脱管对象也称为VO. 1.临时态: 简单来说,由new命令开辟内存空间时刚生成的java对象就是处于临时态. 比如: User user = new User(); 如果没有变量对该对象进行引用,它将被java虚拟机回收. 临时对象在内存中是孤立存在的,它是携带信息的载体,不和数据库的数据有任何关联关系.在hibernate中,可以通过

在Hibernate框架中详谈一级缓存

在学习Hibernate的过程中我们肯定会碰上一个名词---缓存,一直都听说缓存机制是Hibernate中的一个难点,它分为好几种,有一级缓存,二级缓存和查询缓存 今天呢,我就跟大家分享分享我所理解的一级缓存 要想完美的体现出缓存机制的话,我想通过查询语句生成的sql应该就能够很清楚的看到 那些Hibernate的配置信息我就不展示了,直接看关键代码 场景:我要查询同一个对象,查询两次,观察在不同的情况下,sql语句的生成情况 我事先准备了一个HibernateUtil工具类,具体如下 pack

SSH:Hibernate框架(七种关联关系映射及配置详解)

概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系,可以简化,例如:多对一与一对多映射,只是侧重的角度不对而已. 映射技巧 映射技巧是小编写映射文件的过程,总结的经典内容,总共分为四步,咋看不是特别易懂,但是效果很好.下面我们以实例看技巧. (1)写注释 格式为:?属性,表达的是本对象与?的?关系. 解释:在写映射文件之前先写注释,将问号的地方填上相