hibernate对象三种状态 - 我俩绝配

lihaoyang 2021-08-08 原文


hibernate对象三种状态

hibernate里对象有三种状态:

1,Transient 瞬时 :对象刚new出来,还没设id,设了其他值。

2,Persistent 持久:调用了save()、saveOrUpdate(),就变成Persistent,有id

3,Detached  脱管 : 当session  close()完之后,变成Detached。

例子程序:

Teacher类:

 1 package com.oracle.hibernate.id;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.GeneratedValue;
 5 import javax.persistence.Id;
 6 
 7 @Entity
 8 public class Teacher {
 9 
10     
11     
12     private int id;
13     private String name;
14     
15     private String title;
16 
17     @Id
18     @GeneratedValue
19     public int getId() {
20         return id;
21     }
22 
23     public void setId(int id) {
24         this.id = id;
25     }
26 
27     public String getName() {
28         return name;
29     }
30 
31     public void setName(String name) {
32         this.name = name;
33     }
34 
35     public String getTitle() {
36         return title;
37     }
38 
39     public void setTitle(String title) {
40         this.title = title;
41     }
42     
43     
44 }

View Code

测试类:

package com.oracle.hibernate.id;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class HibernateCoreAPITest {

    private static SessionFactory sf = null;

    @BeforeClass
    public static void beforeClass() {
        // try-chatch是为了解决Junit有错误不提示的bug
        try {

            sf = new AnnotationConfiguration().configure()
                    .buildSessionFactory();
        } catch (HibernateException e) {

            e.printStackTrace();
        }
    }

    @Test
    public void testTeacher() {

        Teacher t = new Teacher();
        // 没有设id
        t.setName("li");
        t.setTitle("high");
        // 执行到此时,状态为transient。

        // 在内存中有一个session对象,
        Session session = sf.getCurrentSession();

        session.beginTransaction();
        // save后变成persistent
        session.save(t);

        // 打印出id
        System.out.println(t.getId());
        // commit后自动close session,变成detached状态
        session.getTransaction().commit();

    }

    @AfterClass
    public static void afterClass() {
        sf.close();
    }

}

View Code

代码详细解读,内存分析:

1,当Theacher   t  = new  Teacher(); t.setXXX后,此时的t是没有id的,只是在内存中有了一个Teacher对象t。此时状态就是transient。

2,当执行Session session = sf.getCurrentSession();内存中会有一个Session对象,session对象里有一个hashmap,他其实就是缓存:内存中的一块区域,放着一系列想要的提高读取效率的对象(的引用)。这个HashMap的key,是用来保存将要持久化的对象的id,value保存我们的对象,在这里就是t,其实是保存对象的引用,指向t对象。这都是准备工作,没有调用save方法,里边什么都没有。当执行了session.save(t);就在session的缓存里就有了t对象,key里有了id 1,value指向t对象。调用save方法的同时,会发出insert语句,在数据里也就有了t对象。

所以save完之后,内存里有t对象,数据库里也有t对象,称为persistent状态。

这样做的好处是:

提高效率,如果要找id=1的对象,直接从内存里去查,而不用去数据库里找。

3,当执行了session.getTransaction().commit();session自动关了,session对象没有了,缓存也没了。看图可知,此时t对象在内存中还有,只是HashMap指向t没了。t对象已经脱离了session的管理,称为detached  脱管状态。

总结:

hibernate对象三种状态的区分关键在于:

  a)有没有id

  b)id在数据库中有没有

  c)在内存中有没有(session缓存)

三种状态:

  a) transient :内存中一个对象,没id,缓存中也没有

  b)persistent:内存中有对象,缓存中有,数据库中有(id)

  c)detachd:内存有对象,缓存没有,数据库有

 

 欢迎关注个人公众号一起交流学习:

发表于
2015-10-04 10:02 
我俩绝配 
阅读(6048
评论(0
编辑 
收藏 
举报

 

版权声明:本文为lihaoyang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lihaoyang/p/4854186.html

hibernate对象三种状态 - 我俩绝配的更多相关文章

  1. 【PS扩展面板】Retouching Panel(人像磨皮调色) – 开发小飞

    【PS扩展面板】Retouching Panel(人像磨皮调色) 1、插件说明 Retouching Pane […]...

  2. 如何使用Android真机进行调试 – 法斯特

    如何使用Android真机进行调试 如何使用真机调试应用程序 在开发android应用程序的时候,有时候开发不 […]...

  3. Java 数据结构 – 队列 – binarylei

    Java 数据结构 – 队列 Java 数据结构 – 队列 目录 Java 数据结构 […]...

  4. 前端也要懂物理 —— 惯性滚动篇

    作者:凹凸曼-吖伟 我们在平时编程开发时,除了需要关注技术实现、算法、代码效率等因素之外,更要把所学到的学科知 […]...

  5. 网页左上角图标 favicon.ico – 挨踢前端

    网页左上角图标 favicon.ico 显示网页左上角标志图标 <link rel=”sho […]...

  6. 微信小程序之云开发 – springsnow

    微信小程序之云开发  小程序云开发需要使用注册的小程序appid,测试和游客进入是没有云开发的功能。 现在, […]...

  7. 如何实现工厂设备的数据采集? (转) – hoyong

    如何实现工厂设备的数据采集? (转) 数据采集系统是现场自动化控制设备与管理层之间的信息纽带,工厂中设备众多、 […]...

  8. 阿里云有对手了!CDN横评:腾讯云优势明显 – 腾讯云小助手

    阿里云有对手了!CDN横评:腾讯云优势明显 如今,云计算产品越来越多,像国内的BAT三大巨头都提供了云主机(腾 […]...

随机推荐

  1. docker使用阿里云镜像仓库

    一、阿里云docker仓库 1:阿里云docker仓库 https://dev.aliyun.com/sear […]...

  2. 网页加速系列(二)、 网页加速之网页结构篇

    (二)、 网页加速之网页结构篇 一个网页的结构的好坏,对网页的加载速度有着很大的影响! 1、关于框架结构    […]...

  3. 【转帖】如何看外文文献

    转载:http://emuch.net/bbs/viewthread.php?tid=9085642& […]...

  4. Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式

    一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建 […]...

  5. 爬虫之re数据提取的使用

    爬虫之re数据提取的使用 Posted on 2019-02-18 15:50 BoomOoO 阅读(R […]...

  6. JAVA jsp技术

    JSP的本质是一个类文件,它存储于tomcat(如果你使用tomcat)目录下的work文件夹中,该类文件继承 […]...

  7. 多账号登录控制

    多账号登录控制 场景:java系统中用户账号登录实现控制,实现用户同时只能在一处登录 思路: 用户登录时添加用 […]...

  8. MATLAB 之MATLAB2016b 安装破解教程

    MATLAB2016b 安装破解教程  安装包: 链接: https://pan.baidu.com/s/1R […]...

展开目录

目录导航