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

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

  1. ORM进阶之Hibernate 的三大对象

    ORM进阶之 ORM简单介绍 ORM进阶之Hibernate 简单介绍及框架搭 ORM进阶之Hibernate 的三大对象 我们在上一篇博客中讲到了怎样搭建一个Hibernate框架, 提到Hiber ...

  2. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  3. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

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

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

  5. hibernate中对象集合的保存

    一.在java web设计中经常使用对象进行操作,在hibernate中对象集合的保存(一对多) 1需要进行如下步骤: 1) 设计数据表关系 2)引入jar包,需要注意引入数据库connector 3 ...

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

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

  7. Hibernate 中对象关系映射(ObjectRelationMapping)

    1.什么是对象关系映射? 解析:对象-关系映射(Object Relational Mapping,简称ORM,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说, ...

  8. hibernate中对象的3种状态:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached). 处于持久态的对象也称为PO(Persistence Objec ...

  9. Hibernate中对象的3种状态:瞬时态、持久态、脱管态

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久 态的对象也称为PO(Persistence Objec ...

随机推荐

  1. base64对文件进行加密

    将原文件读取为字节数组,然后用base64加密,得到加密的字符串 https://stackoverflow.com/questions/475421/base64-encode-a-pdf-in-c ...

  2. LDA解决的问题

    人类是怎么生成文档的呢?LDA的这三位作者在原始论文中给了一个简单的例子.比如假设事先给定了这几个主题:Arts.Budgets.Children.Education,然后通过学习训练,获取每个主题T ...

  3. Node.js:Buffer

    ylbtech-Node.js:Buffer 1.返回顶部 1. Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文 ...

  4. HTML中href、src区别

    href是Hypertext Reference的缩写,表示超文本引用.用来建立当前元素和文档之间的链接.常用的有:link.a.例如: <link href="reset.css&q ...

  5. python程序中用类变量代替global 定义全局变量

    在python编程中,一般使用global 关键字来定义全局变量,但是发现 global 关键字在涉及多个文件时,好像存在问题. 比如,单个文件下用global定义使用全局变量的情况 ,看下面的代码 ...

  6. SpringBoot中拦截器和过滤器的使用

    一.拦截器 三种方式 继承WebMvcConfigurerAdapter   spring5.0 以弃用,不推荐 实现WebMvcConfigurer  推荐 继承WebMvcConfiguratio ...

  7. DB2大数据量优化查询解决方案

    利用DB2表分区的功能对大数据量的表进行分区,可以优化查询. 表分区介绍: 表分区是一种数据组织方案,它根据一列或多列中的值把表数据划分为多个称为数据分区 的存储对象. (我觉得表分区就类似于Wind ...

  8. 实现model中的文件上传FTP(一)

    由于在django的model中配置了filefield或者imagefield配置了upload_to参数只能将用户上传的文件上传到项目本地,就算重定向到项目外也只是直接读取文件系统,这样对未来的项 ...

  9. ProgressDialog的关键几个函数

    进度条对话框在开发是常见的一种工具,只要注意以下几点,就可以轻松使用. ProgressDialog.setMax(MAX_PROGRESS);  //设置最大值,可以如下定义一个常值 //priva ...

  10. SaltStact自动化运维工具01

     什么是saltstackSaltstack是基于python开发的一套C/S架构配置管理工具使用SSL证书签方的方式进行认证管理底层使用ZeroMQ消息队列pub/sub方式通信    – 号称世界 ...