hibernate里对象有三种状态:

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

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

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

例子程序:

Teacher类:

 package com.oracle.hibernate.id;

 import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; @Entity
public class Teacher { private int id;
private String name; private String title; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} }

测试类:

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();
} }

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

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:内存有对象,缓存没有,数据库有

转载:https://www.cnblogs.com/lihaoyang/p/4854186.html

【转】hibernate对象三种状态的更多相关文章

  1. hibernate对象三种状态

    在Hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObje ...

  2. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  3. hibernate的三种状态(儿)

    第五讲:hibernate的三种状态 瞬时:bean对象与session,与数据库无关.在session对象的save方法保存之前. 持久状态(托管):bean对象与session有关,数据库中有对应 ...

  4. 第五讲:深入hibernate的三种状态

    学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...

  5. [转]深入hibernate的三种状态

    学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...

  6. 深入hibernate的三种状态

    学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...

  7. hibernate的三种状态和缓存

    hibernate的三种状态: 1.瞬时态:对象里面没有id值,对象与session没有关联 类似,把class类new出来,不存进session 2.持久态:对象里面有id值,对象与session关 ...

  8. 举例理解Hibernate的三种状态

    初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态). 它们之间有如下转换图来说明: 1.tr ...

  9. 深入hibernate的三种状态(转)

    hibernate的三种状态: 瞬时对象,持久化对象,托管对象. hibernate的两级缓存:1>一级缓存:session    2>二级缓存:sessionfactory. 瞬时对象: ...

随机推荐

  1. D3力布图绘制--节点间的多条关系连接线的方法(转)

    在项目中遇到这样的场景,在使用D3.js绘制力布图的过程中,需要在2个节点间绘制多条连接线,找到一个不错的算法,在此分享下. 效果图: HTML中要连接 <!DOCTYPE html> & ...

  2. 【shell脚本】自动监控tomcat服务===autoCheck.sh

    自动监控tomcat服务,当tommcat服务挂掉时自动重启 一.脚本内容 [root@localhost ]# cat /root/autoCheck.sh #!/bin/bash startTom ...

  3. Python保存json文件并格式化

    使用json.dump()的时候设置一下indent参数的值就好了.比如json.dump(json_dict, f, indent=4), ensure_ascii=False,写入中文

  4. css隐藏页面元素的方法

    用css隐藏页面元素有许多种方法. 第一种方法[opacity: 0;] opacity属性通常用于设置一个元素的透明度,从另一个角度来看,如果透明度为0,也就从视觉上隐藏了该元素. 这个属性不是为改 ...

  5. mysql的sql调优: slow_query_log_file

    mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数.如果在my.cnf里面修改,需增加如 ...

  6. 【机器学习】PCA

    目录 PCA 1. PCA最大可分性的思想 2. 基变换(线性变换) 3. 方差 4. 协方差 5. 协方差矩阵 6. 协方差矩阵对角化 7. PCA算法流程 8. PCA算法总结 PCA PCA 就 ...

  7. springboot2使用外部的tomcat服务器创建项目步骤

    使用内置的Servlet容器.应用打成可执行的jar.外置的Servlet容器:外面安装Tomcat---应用war包的方式打包: a).必须创建一个war项目:(利用idea创建好目录结构) b). ...

  8. C#,File.AppendAllLines(),换行"\r\n"

    string sourcePath = @"D:\GL\20160826141915999999.txt"; for (int i = 0; i < 10; i++) { G ...

  9. VS2019打开旧项目导致引用失效的解决方案

    用VS2019打开VS2015创建的MVC项目时所有引用全部失效: 解决方案: 打开项目的csproj文件,删除 Target节点,在重新打开项目. <Target Name="Ens ...

  10. Scrum 冲刺第一篇

      我们是这次稳了队,队员分别是温治乾,黄思扬,莫少政,余泽端,江海灵 码云地址为:https://gitee.com/sixers/activityWall-Web 一.各个成员在 Alpha 阶段 ...