Hibernate 持久化对象状态

持久化对象PO类状态

1.状态分类

   transient  瞬时态:hibernate的session缓存中没有存放,数据库中没有数据。例如新建的po类,没有OID值

persistent  持久态:hibernate的session缓存中存放,数据库中最终会有。例如save(po) 完成commit操作,有OID值

detached   脱管态:hibernate的session缓存中没有,数据库中有数据。脱离session的管理,有OID值

 2.OID

OID:hibernate用于标记PO类

java区分对象:地址

数据 区分数据:主键不同

例如:

new Student().setSid(1)

new Student().setSid(1)

认为两个相同PO类

3.状态之间的转换

瞬时态:

转换持久态:save() | saveorUpdate()  如果有OID将执行saveorUpdate(),没有OID将执行save()

脱管态:手动设置OID

Student  stu = new Student();    //瞬时态

stu.setSid(1)                             //脱管,如果数据库中OID对应数据不存在,抛出异常

持久态:

瞬时态:执行delete()   记住。网上所说是:删除态,官方没有给出

脱管态:evict、close、clear

evict():将指定PO类从session中移除

      clear():将session缓存清除,清除所有

      close():session关闭不存在session缓存

脱管态:

瞬时态:执行delete() 手动移除OID

持久态:执行update()、saveorUpdate()

4.一级缓存

   一级缓存:指hibernate session级别的缓存,在session缓存数据

get()通过id查询PO类,将查询的结果缓存到一级缓存(session)

代码如下

package cn.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.hibernate.bean.Student;

public class CacheTest {

private SessionFactory factory = new Configuration()
.configure().addClass(Student.class)
.buildSessionFactory();

@Test
public void demo01(){
Session session = factory.openSession();
//查询id为1的Student对象
/*Hibernate:
load cn.hibernate.bean.Student select
student0_.sId as sId0_0_,
student0_.sName as sName0_0_
from
Student student0_
where
student0_.sId=?
Student [sId=1, sName=333]
*/
Student student=(Student)session.get(Student.class, 1);
System.out.println(student);
}

@Test
public void demo02(){
Session session = factory.openSession();
//查询两次id为1的Student对象,按理应该产生两条sql语句,其实只有一条。但是出现了两个相同对象的输出结果
/*Hibernate:
load cn.hibernate.bean.Student select
student0_.sId as sId0_0_,
student0_.sName as sName0_0_
from
Student student0_
where
student0_.sId=?
Student [sId=1, sName=333]
Student [sId=1, sName=333]
*/
Student student=(Student)session.get(Student.class, 1);
System.out.println(student);
//调用evict()方法清除session中student对象进一步查看产生sql语句
// session.evict(student);
System.out.println("********************************************");
/*Hibernate:
load cn.hibernate.bean.Student select
student0_.sId as sId0_0_,
student0_.sName as sName0_0_
from
Student student0_
where
student0_.sId=?
Student [sId=1, sName=333]
Hibernate:
load cn.hibernate.bean.Student select
student0_.sId as sId0_0_,
student0_.sName as sName0_0_
from
Student student0_
where
student0_.sId=?
Student [sId=1, sName=333]
*/
Student student1=(Student)session.get(Student.class, 1);
System.out.println(student1);
}

}

时间: 2024-11-08 17:38:20

Hibernate 持久化对象状态的相关文章

Hibernate持久化对象状态、转换方法和操作步骤

1  持久化对象三种状态 瞬态:对象由new操作符创建,且尚未与Hibernate Session关联的对象被认为处于瞬态.瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识.如果程序中失去了瞬态对像的引用,瞬态对象将被垃圾回收机制销毁.使用Hibernate Session可以将其变为持久化状态. 持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识(identifier).持久化的实例可以是刚刚保存的,也可以是刚被加载的.无论哪一种,持久化对象都必须与制定的Hibernate

Hibernate持久化对象状态

在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 分别是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状态 由new命令开辟内存的java对象.例如:Student stu= newStudent();若没有变量对他引用,则被jvm回收.瞬时对象在内存中孤立存在,他的意义仅是携带信息的载体,不和数据库中的数据有任何的关联.通过session的save()和saveOrUpdate()方法可以把一个瞬时

Hibernate持久化对象的三种状态

在Hibernate中,持久化对象在被操作的过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的.Session的特定方法能使对象从一个状态转换到另一个状态. 持久化对象的生命周期有三种,瞬时状态.持久状态和分离状态.如下图: 瞬时态 不曾进行持久化,未与任何Session相关联.此状态的对象是用new关键字创建出来的,此时对象没有和数据库中记录对应. //Transient状态 Useruser = new User();

【hibernate进阶】hibernate持久化对象的三种状态

Hibernate持久化对象的三种状态:瞬时对象(Transient Objects),持久化对象(Persist Objects),离线对象(Detached Objects). 三种状态:    瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不在引用这些对象(不再被任何其他对象所引用),它们的状态将会丢失,并由垃圾回收机制回收. 持久化对象(Persist Objects

hibernate 持久化对象的生命周期

包括三种状态:瞬态(自由态),持久态,托管态(游离态) 自由态 持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联. 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中. 游离态 处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态.也就是说Session实例是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象迚入游离状态. session.beginTransaction(); Us

Hibernate持久化对象

持久化类应遵循的规则: 有无参构造器,构造器的修饰符>=默认访问控制符 有标识属性,映射数据库表的主键,建议使用基本类型的包装类 每个成员有setter和getter 非final修饰的类 重写equals()和hashCode()方法(当需要把持久化类的属性放进Set中时) 持久化类的状态: 改变持久化对象状态的方法: 持久化实体: Serializable save(Object obj)   保存到数据库 void persist(Object obj) Serializable save

Hibernate持久化对象的状态

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

hibernate持久化对象三种状态及其转换

持久化类类三种状态介绍1. 瞬时态:也叫做临时态或自由态,它一般指我们 new 出来的对象,它不存在 OID, 与 hibernate session 无关联,在数据库中也无记录.它使用完成后,会被 jvm 直接 回收掉,它只是用于信息携带.简单说:无 OID 与数据库中的信息无关联,不在 session 管理范围内.2. 持久态:在 hibernate session 管理范围内,它具有持久化标识 OID 它的特点,在事 务未提交前一直是持久态,当它发生改变时, hibernate 是可以检测

Hibernate 持久化对象的状态

持久化对象有3种状态:1.持久化状态      2.临时状态      3.游离状态 Session 的特定方法能使对象从一个状态转换到另一个状态临时对象(transient)•    在使用代理主键的情况下, OID 通常为 null•    不处于 Session 的缓存中•    在数据库中没有对应的记录 持久化对象(也叫”托管”)(Persist)•    OID 不为 null•    位于 Session 缓存中•    持久化对象和数据库中的相关记录对应•    Session 在