ORM进阶之Hibernate中对象的三大状态解析

ORM进阶之
ORM简单介绍

ORM进阶之Hibernate简单介绍及框架搭

ORM进阶之Hibernate的三大对象

ORM进阶之Hibernate中对象的三大状态解析

在Hibernatea中每一个对象都有三种状态,他们在这三种状态下,Hibernate会他们进行不同的处理。下边我们通过一张图来看一下这三种状态以及他们之间的互相转换!

能够看到对象可能会有这三种状态。暂时状态(transient),持久化状态(persistent)。游离状态(detached)。下边我们来分别来解释一下这三种状态。

暂时状态(Transient Objects)

通过 new 创建的对象,是暂时对象,假设暂时对象不做不论什么操作的话,会被gc回收,说明这样的状态的对象没有与数据库有交互的能力,存在于session缓存外。

暂时对象的是不处于Session缓存中,没有与不论什么Session实例关联。并且数据库中没有相相应的记录,并且编码的时候能够为暂时对象设置OID值。但终于Hibernate不会採用,它用的是内置的主键生成策略。

下面情况,java对象进入暂时状态

(1) 当通过new语句刚创建了一个Java对象。它处于暂时状态,此时不和数据库中的不论什么记录相应。

(2) Session的delete()方法能使一个持久化对象或游离对象转变为暂时对象。对于暂时对象,delete()方法从数据库中删除与它相应的记录;对于持久化对象,delete()方法从数据库中删除与它相应的记录,而且把它从Session的缓存中删除。

看一下代码展示

<span style="font-size:18px;">public class UserService {
      public void  add() {
             //创建一个   Configuration
         Configuration cfg = newConfiguration().configure();
         SessionFactory factory = cfg.buildSessionFactory();
         //打开session
         Session session = factory.openSession();
         //开启事务
         Transaction tran = session.beginTransaction();
         //创建一个user对象
//       User user = new User();
//       user.setId(1001);
//       user.setUsername("zhanghongjie");
//       user.setPasswords("zhanghongjie");
         /*
          * 此时的user是暂时状态。不在缓存中,也不会与数据库进行交互
         */
         User user=(User)session.load(User.class, 1001);
         session.delete(user);
         /*
          * 此时的user是暂时状态。

不在缓存中,也不会与数据库进行交互,可是在数据库中会有对应的记录
          */
          //提交事务。保存到数据库中
         tran.commit();
         session.close();
    }
}</span>

持久化对象(Persist Objects)

持久化对象是具有数据库标识的实例。由Session统一管理。持久实例是在事务中操作,他们的状态在事务借宿的同一时候与数据库同步。

当事务提交时。通过运行SQL的INSET,UPDATE和DELETE语句把内存中的状态同步到数据库中。

持久化特征总结:

1.位于Session实例的缓存中。也能够说持久化对象被一个Session实例关联

2.持久化对象鱼数据库中的记录相相应

3.Session在清理缓存时(session.flush)。会依据持久化对象的属性变化,来同步更新数据库

4.Hibernate 保证在同一个Session实例的缓存中,数据库表中的每条记录仅仅相应惟一的持久化对象。即 hibernate会为持久化对象分配惟一的OID标识这个持久化对象

下面情况,java对象进入持久化状态

1.通过 save()方法将一个暂时对象转为持久对象

2.通过get()或load()方法将数据库表中的记录转成持久化对象

3.通过find()方法返回的List集合中的对象也是持久化对象

4.通过update()或saveOrUpdate()和lock()方法使 游离对象 转化为 持久化对象

<span style="font-size:18px;">public class UserService {
	public void  add() {
		//创建一个   Configuration
		Configuration cfg = new Configuration().configure();
		//创建SessionFactory
		SessionFactory factory = cfg.buildSessionFactory();
		//打开session
		Session session = factory.openSession();
		//开启事务
		Transaction tran = session.beginTransaction();
		//创建一个user对象
		/*
		 *第一种情况
		User user = new User();
		user.setId(1001);
		user.setUsername("zhanghongjie");
		user.setPasswords("zhanghongjie");
		session.save(user);
		user.setUsername("hongjie");
	 	session.update(user);
		 */
		/* 另外一种情况
		User user=(User)session.load(User.class, 1001);
		*/
		/*
	 * 以上的情况  的user是持久化状态。在缓存中。也能够与数据库进行交互
		 */
		//提交事务。 保存到数据库中
		tran.commit();
	    session.close();
	}
}</span>

游离对象(Detached Objects)

Session关闭后,或者清除Session缓存和清除指定缓存。持久化对象变为游离对象,此时该对象不能再与数据库交互,也就是不能同步。不再受Hibernate管理。

游离对象的特征总结:

1.不在Session一级缓存里面。但又有OID值。

2.数据库里也有相对于的记录存在(除非其它操作删除了该记录)。但不再具有和数据库交互的能力,不能再同步。

public class UserService {
	public void  add() {
		//创建一个   Configuration
		Configuration cfg = new Configuration().configure();
		//创建SessionFactory
		SessionFactory factory = cfg.buildSessionFactory();
		//打开session
		Session session = factory.openSession();
		//开启事务
		Transaction tran = session.beginTransaction();
		//创建一个user对象
		User user =(User)session.load(User.class, 1001);
		tran.commit();
	    session.close();
	    /*
	     * 这个时候session关闭了, 我们能够操作user对象,可是不能与数据库进行交互!
	     */
	}
}

游离对象和暂时对象差别

两者都不被session关联,就算属性变化也不能与数据库保持同步,而游离对象是由持久化对象转变而来,所以数据库中有相应记录(除非删除),而暂时对象在数据库并没有记录,用恰当比喻来说。游离对象相当于退休老人。退休老人不在岗位上。但资料库里还有他曾经相关的记录,而暂时对象是还没正式进入这家公司的年轻人,还没上岗,资料库也没有年轻人的记录。

Hibernate中对象的三大状态的理解,对于我们非常好的处理对象有非常多的优点,所以我们要弄清这三个对象。以及对象之间的转换!

时间: 2024-08-01 10:44:12

ORM进阶之Hibernate中对象的三大状态解析的相关文章

ORM进阶之Hibernate中关系映射

ORM进阶之 ORM简介 ORM进阶之Hibernate简介及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 ORM进阶之Hibernate中一对一的关系映射 映射可以说是在hibernate中非常重要的一个内容,通过映射可以让程序员不再思考复杂的sql语句,而是更加的专注于业务逻辑的实现.映射通过一个xml配置文件完成并且我们可以对他进行修改!下边我们来看一下如何完成映射的! 单表映射 每个实体对应一张表,跟其他的实体没有关联关系,这是最简

ORM进阶之Hibernate 的三大对象

ORM进阶之 ORM简介 ORM进阶之Hibernate 简介及框架搭 ORM进阶之Hibernate 的三大对象 我们在上一篇博客中讲到了如何搭建一个Hibernate框架, 提到Hibernate我们就不得不说他的三大对象,Configuration,SessionFactory , Session .下边我们就分别来解释一下这三大对象! Configuration对象 Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管

ORM进阶:Hibernate对象的三大状态

简介 Hibernate负责将实体模型,关联到关系模型.那么在程序运行过程中,如何保证实体对象与数据库中的一致性呢? 首先要了解一下Hibernate对象中的三种状态: 三种状态 临时状态(Transient) 持久状态(Persistent) 游离状态(Detached) 状态的含义 临时状态 在程序中第一次使用该对象.(既然是第一次使用实体对象,那么当然数据库中是没有该记录的) 即:实体模型中存在,但是不被Session管理,数据库中没有该记录. 持久状态 当临时状态的对象,执行save()

关于hibernate中对象的三种状态分析

一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load():持久态到瞬态的方法有delete():游离态到持久态的方法有update().saveOrUpdate().lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二,Hibernate的状态 hibernate的

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

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

hibernate中对象的三种状态分析

一,首先hibernate中对象的状态有 三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate(). get().load():持久态到瞬态的方法有delete():游离态到持久态的方法有update().saveOrUpdate(). lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二,Hibernate的状态 hiberna

hibernate中对象集合的保存

一.在java web设计中经常使用对象进行操作,在hibernate中对象集合的保存(一对多) 1需要进行如下步骤: 1) 设计数据表关系 2)引入jar包,需要注意引入数据库connector 3)写实体类 4)配置映射文件和hibernate.cfg.xml 2例子如下: 员工和部门的关系,多个员工属于一个部门,一个部门有多个员工.可以在员工表上设置一个外键解决一对多的关系. 2.1)创建表 CREATE TABLE employee( id INT PRIMARY KEY AUTO_IN

(09)Hibernate中对象的状态

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

hibernate映射对象三种状态的分析

一,首先hibernate中对象的状态有 三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate(). get().load():持久态到瞬态的方法有delete():游离态到持久态的方法有update().saveOrUpdate(). lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二,Hibernate的状态 hiberna