java中Hibernate的状态总结

在Hibernate框架中对象的存在有不同的状态,只有理解了这些状态,才能对Hibernate的工作机制有所认知。主要有四种:瞬时状态、持久化状态、脱管状态和删除态 。都比较好理解,大致可以看作是临时、稳定、半稳定、回收的几种形式,下面就Hibernate的这几种状态带来详细的介绍。

1.瞬时状态

通过new开辟内存空间创建的实体对象,但是它没有纳入hibernate session的管理之中,如果没有变量对它引用,它将会被JVM(垃圾回收器)回收。瞬时状态的对象在内存中是孤立的,它与数据库无任何关联,仅仅是一个信息携带的载体。

一个瞬时状态对象被持久化状态对象引用,它也会自动变为持久化状态对象。例如调用session的save、saveorupdate等方法的时候。

特征:

(1)使用 new 创建出来的对象,没有设置 id 属性

(2)没有被 session 托管,换句话说 对象数据 存放在内存中, 没有存放到 session 缓存中

(3)临时对象数据 与 数据库中的数据 还没任何关联

2.持久化状态

持久化状态对象存在与数据库中的数据关联,它总是与会话状态(Session)和事务(Transaction)关联在一起。当持久化状态对象发生变动时并不会立即执行数据库操作,只有当事务结束时,才会更新数据库,以便保证Hibernate的持久化对象和数据库操作的同步性。

当持久化状态对象变为托管状态对象时,它将不在Hibernate持久层的管理范围之内。

特征:

(1)要么是从数据库中使用 get 或 load 方法查询到的数据对象, 要么是 使用save 或 update 方法数据转变成持久层对象

(2)对象 数据被 session 托管。换句话说 对象数据 在 session 缓存中有一份,在数据库中有相应的记录

3.脱管状态

当持久化对象的Session关闭之后,这个对象就从持久化状态变为托管状态。托管状态的对象仍然在与数据库中的数据关联,但是他并不在Hibernate的Session管辖范围之内。

如果将脱管状态的对象重新关联到某个新的Session上,它将变回持久化状态对象。

特征:

(1)主要是通过 持久状态对象,调用 session.evict() 或 session.clear() 或 session.close() 得到的,也可以new 一个设置 id 值的对象

(2)session 缓存中没有,内存中有的对象(注: 该对象设置了 id 值)

4.删除态

调用session的delete方法时,对象转为删除态。删除态只能等待被回收。

知识点扩展:

Hibernate的检索方式

导航对象图检索(根据已经加载的对象,导航到其他对象。)

  • OID检索(按照对象的OID来检索对象。)
  • HQL检索(使用面向对象的HQL查询语言。)
  • QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线)
  • 本地SQL检索(使用本地数据库的SQL查询语句。)

包括Hibernate的检索方式,Hibernate中对象的状态,Hibernate的3种检索策略是什么,分别适用于哪种场合,ORM解决的不匹配问题, Hibernate映射继承关系的3种方式,Session的find()方法以及Query接口的区别等方面问题的总结

临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。

持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。

游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。

Hibernate的3种检索策略是什么,分别适用于哪种场合

立即检索

优点:对应用程序完全透明。

缺点:select语句数目多。

适用:类级别。

延迟检索

优点:由应用程序决定加载哪些对象,可以避免执行多余的select语句以及避免加载不需要访问的对象,节省内存空间,提高检索效率。

缺点:应用程序如果要访问游离态的代理类实例,必须保证它在持久化时已经被初始化。

适用:一对多或多对多关联。应用程序不需要立即访问或者根本不会访问的对象。

迫切左外连接检索

优点:对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以方便的从一个对象导航到另一个与它相关联的对象。使用了外连接,select语句数目少。

缺点:可能会加载程序不许要访问的对象。复杂的数据库表连接形象检索性能。

适用:一对一或多对一关联。应用程序需要立即访问的对象。数据库系统具有良好的表连接性能。

到此这篇关于java中Hibernate的状态总结的文章就介绍到这了,更多相关java之Hibernate的状态整理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JAVA中通过Hibernate-Validation进行参数验证

    在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而hibernate-validator提供了一些常用的参数校验注解,我们可以拿来使用. 1.maven中引入hibernate-validator对应的jar: <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4

  • Java Web学习教程之Hibernate And MyBatis的理解

    前言 在JavaWeb开发中,最经典的就是SSH框架组合和SSM框架组合,现在很多IT公司愿意使用SSM,对于这里的H和M即Hibernate和MyBatis,今天简单来说道说道. 班门弄斧 上课时,我经常跟学生说,学习任何一门技术,一定要弄明白: What:这个东西是什么?连这个技术是什么都说不清,人家会相信你精通吗? Why:为什么要用?不要盲目学,一门技术的产生肯定有其背后的原因,解决了一个什么难题?还是简化了开发等等? When:什么时候需要用?学完了不会灵活运用也不行. How:怎么用

  • java中Hibernate面试知识点整理

    作为常用的框架之一,Hibernate在面试的时候难免会被问到.好在涉及的都是一些理论方面的知识点,比如概念.原理.使用之类的.我们在面试之前可以针对这方面的题目,做一个充足的准备,即使有些人对hibernate框架的了解并不深入.下面我们就hibernate框架中常见的面试题带来介绍. 1. 为什么要使用 hibernate? (1).对JDBC做了轻量级的封装,简化了数据访问层编码. (2).Hibernate是一个ORM框架,开发者可以使用面向对象的思想操作数据库,使用更加方便. (3)

  • JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis

    MyBatis MyBatis 是一个基于 Java 的持久层框架.MyBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索. MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录. 目前,Java 的持久层框架产品有许多,常见的有 Hiber

  • Hibernate传入Java对象创建动态表并录入数据

    看到Hibernate你给一个对象,他就能动态的创建配置文件里面指定的表名,然后把数据录入到数据库,当初感觉是很神奇,不过,好像Hibernate不能动态的分表创建表和录入数据 我这里写了一个公用的类,你给一个对象,告诉我按年还是按月生成表,并告诉我那个字段是不需要在表中创建的,该类就可以动态的分表创建需要的表,并录入数据 注意: 由于业务需要,这里对于字段的支持只有int和Integer,double和Double 还有String,同时对于String统一创建为了Varchar(100)的字

  • java中mybatis和hibernate的用法总结

    在项目开发上,hibernate提供的经验简化了不少工作量和兼容性,但这些绝对需要有经验后才能明白,对于新手来说使用起来很困难.hibernate比mybatis掌握难度要高一些,对sql的控制弱一些.下面我们就三个方面带来mybatis和hibernate的总结分析,一起来看看二者的比较吧. 1.开发效率 如果是做一些简单的CMS类似的只有简单的增删改查的项目,那么使用Hibernate更有优势,不需要掌握太多的Hibernate知识,只需要会一些基本的查询和一些配置(Hibernate真正要

  • Java web Hibernate如何与数据库链接

    java web添加structs特性后再添加Hibernate特性,这可以通过右键工程->my eclipse出现工具条选中相应的条目,添加相应的属性, 添加完Hibernate后建立与数据库的链接,然后就可以进行反向了, 讲一下建立数据库连接: 在my eclipse中选中window->other perspective 打开DB browser,如下图: 接下来在空白处右键,新建连接即可弹出如下对话框: 接下来选择相应的Driver template一般和数据库有关,mysql一般选M

  • java中Hibernate的状态总结

    在Hibernate框架中对象的存在有不同的状态,只有理解了这些状态,才能对Hibernate的工作机制有所认知.主要有四种:瞬时状态.持久化状态.脱管状态和删除态 .都比较好理解,大致可以看作是临时.稳定.半稳定.回收的几种形式,下面就Hibernate的这几种状态带来详细的介绍. 1.瞬时状态 通过new开辟内存空间创建的实体对象,但是它没有纳入hibernate session的管理之中,如果没有变量对它引用,它将会被JVM(垃圾回收器)回收.瞬时状态的对象在内存中是孤立的,它与数据库无任

  • 详解Java中Hibernate的基本原理

    在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低? 如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎么做的,你也可以很快上手. 这难道是学习的最终目的吗? 不是,绝对不是.我们需要了解这门技术的基本概念,它到底是什么,它是干什么的,它有什么优缺点.下面我就带领大家一起回顾一下Hibernate: 什么是Hibernate? Hibernate,翻译过来是冬眠的意思,正好现在已经进入秋季,世间万物开

  • java中线程的状态学习笔记

    java开发中,我们经常会遇到线程的问题,比如你做一个商城,就需要考虑它的并发问题等等,今天给大家分享一下java中线程的状态 先说线程的第一个状态,是新建状态,这个是线程刚刚创建的时候,如: new Thread(),具体如图 线程的第二种状态是可执行状态,就是调用了start方法后的状态,当然了,一个运行的状态,他有可能是正在运行的,也有可能是没有运行的,只是他的状态是可运行的状态,具体如图 第三种状态是被阻塞或者处于等待的线程,处于这种状态下的线程是不活动且不运行的,比如说调用了wait方

  • java中Hibernate缓存形式总结

    对于数据的访问来说,肯定是在有缓存的情况下运行快一些.对于Hibernate这种与数据库结合紧密的框架来说,在调用数据的时候肯定会有缓存的出现,其中有三种缓存的形式存在:一级缓存.二级缓存和查询缓存.下面我们就Hibernate中这三种缓存的类型分别带来介绍. 1.一级缓存 hibernate的一级缓存是session级别的,所以如果session关闭后,缓存就没了,此时就会再次发sql去查数据库. /** * 此时会发出一条sql,将所有学生全部查询出来,并放到session的一级缓存当中 *

  • 总结Java中线程的状态及多线程的实现方式

    线程的状态 线程状态图: 说明: 线程共包括以下5种状态. 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行. 3. 运行状态(Running) : 线程获取CPU权限进行执行.需要注意

  • java中hibernate二级缓存详解

    Hibernate的二级缓存 一.缓存概述 缓存(Cache): 计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数据是数据存储源中数据的拷贝.缓存的物理介质通常是内存 hibernate中提供了两个级别的缓存 第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存.这一级别的缓存由 hibernate 管理的,一般情况下无需进行干预 第二级别的缓存是 S

  • Java中SpringSecurity密码错误5次锁定用户的实现方法

    Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. 下面看下实例代码: 第

  • Java中线程的基本方法使用技巧

    java中线程的基本方法的熟练使用是精通多线程编程的必经之路,线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等,本文浅要的介绍一下它们的使用方式. 线程的状态图 java将操作系统中的就绪和运行两种状态统称为可运行状态,java中线程的状态可以认为有以上六种. wait 调用该方法的线程进入WAITING状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用wait()方法后,会释放对象的锁. 因此,wait方法一般用在同步方法或同步代码

随机推荐