Hibernate是一个彻底的O/R Mapping 框架。之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全

面向对象的方式来操作数据库。

但是当开发者需要深入的了解Hibernate底层运行时,对Hibernate的数据访问进行优化时,就需要了解Hibernate的底层SQL操作了。由于对于绝大部分的应用来说,

数据访问是一个十分巨大的,耗时的操作,因此深入Hibernate底层对应的SQL操作非常必要。

1.持久化类的要求

所有的持久化类都应该有一个无参构造器。

提供一个标识属性(Field):标识属性通常是映射数据库表的主键字段。这个属性可以叫任何名字,类型可以是基本类型,基本类型的包装类,String,或者Date。如果该数据库表使用了联合主键,那么这个标识属性可以是用户定义的一个类,这个类拥有联合主键的字段作为属性。虽然Hibernate允许使用基本类型作为标识属性的类型,但还是建议可以用基本类型时,用基本类型的包装类进行代替。

为持久化类的每个属性提供setter和getter方法:   也就是 JavaBean风格。

选择性的重写equals()和hashCode()方法:如果需要把持久化类的对象放入Set集合中(当实现关联映射时,推荐这么做),则应该为持久化类重写equals()方法和hashCode()方法。

2.持久化类的对象的状态
瞬态状态:对象由new操作符创建出来,且尚未与Hibernate Session对象进行关联,此时的持久化类的对象处于瞬态。对于瞬态状态对象的操作或者改变,不会被保存 到数据库中去。如果程序中失去了对于处于瞬态状态对象的引用,瞬态状态的对象就会被垃圾回收器销毁。通过使用Hibernate Session对象的save()方法,可以把处于瞬态状态的对象,转化为处于持久化状态的对象。

持久化状态:当一个持久化类的对象,与Hibernate Session对象进行了关联,那么这个对象就处于持久化状态了,处于持久化状态的对象在数据库中有对应的一条记录,并拥有一个持久化标示符。对于持久化状态的对象,进行任何的改动,Hibernate都会自动检测到,然后把改动后的内容写回数据库中。开发者不需要手动的执行update。

脱管状态:某个处于持久化状态的对象,由于与之关联的Hibernate Session对象的关闭,该对象就由持久化状态沦为脱管状态。如果对于处于脱管状态的对象进行了操作或者修改,而后这个对象重新被Hibernate Session对象进行关联,即重新回到了持久化状态,那么对脱管状态时期的操作不会丢失,也会被写入数据库中。

3.Hibernate Session对象改变持久化类的对象状态的方法

sess.save(Object obj)   :将obj对象转化为持久化状态          返回obj对象的标识符。

sess.persist(Object obj) :将obj对象那个转化为持久化状态     返回值为  void

使用上面两个方法将一个对象转化为持久化状态    底层会生成一条insert语句

News  n  = sess.load(News.class ,  new Integer(pk));

load()方法通过指定持久化类的类对象,和标识属性值  来 返回一个持久化状态的对象 也就会数据库中一条记录。

类似的还有get()方法。

使用上面两个方法获得一个持久化状态的对象   底层会生成一条select语句

n.setTitle("Hibernate");

通过获得的持久化状态对象,然后对它进行操作    底层;会生成一条update语句

sess.update(n);  如果n对象处于脱管状态    将n对象与sess对象关联  重新回到持久化状态

sess.updateOrSave(n);   不清楚n对象现在是处于瞬态 还是脱管状态   都转化为持久化状态

sess.merge(n);        将n对象的数据改变添加到数据库中   但是n对象仍然不是持久化状态

通过上面的方法来处理脱管状态的对象

sess.delete(n)   :  删除处于持久化状态的对象   持久化状态的对象对应的数据库记录会被删除

这条语句   底层会生成一条 delete语句

Hibernate之深入持久化对象的更多相关文章

  1. Hibernate入门5持久化对象关系和批量处理技术

    Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...

  2. hibernate学习之持久化对象

    Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置 ...

  3. hibernate框架(3)---持久化对象

    持久化对象 再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别: 简单总结: (1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库 ...

  4. 【Hibernate步步为营】--核心对象+持久对象全析(二)

    上篇文章讨论了Hibernate的核心对象,在开发过程中经经常使用到的有JTA.SessionFactory.Session.JDBC,当中SessionFactory可以看做数据库的镜像,使用它可以 ...

  5. 2.一起来学hibernate之配置文件1与持久化对象

    学框架,配置都是不可少的,有了配置,框架才知道我们想做什么,才知道如何去执行我们需要的操作! hibernate的配置文件,总体来说分为两个部分: 1.主配置文件hibernate.cfg.xml文件 ...

  6. Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征

    以下情况java对象进入持久化状态: session.save()方法把临时对象转变为持久化对象. session.load()和session.get()方法得到的对象总是处于持久化状态. sess ...

  7. Hibernate之Session对象的相关方法以及持久化对象的状态

    一.持久化对象的状态        站在持久化的角度, Hibernate 把对象分为 4种状态: 持久化状态,临时状态,游离状态,删除状态.Session 的特定方法能使对象从一个状态转换到另一个状 ...

  8. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  9. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

随机推荐

  1. Qtree3题解(树链剖分(伪)+线段树+set)

    外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意: 很明显吧.. 题解: 我的做法十分的暴力:树链剖分(伪)+线段树+\(set\)... ...

  2. 【HAOI2009】毛毛虫

    题面 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了(图 2 ). 输入 ...

  3. Luogu3242:[HNOI2015]接水果

    题面 Luogu3242 Sol 考虑每个盘子怎样才能接到一个水果 分两种情况: 盘子的\(x, y\)在一条链上,那么水果的两点就要在这条链之外 不在的话,水果的两点就分别在盘子的两点的子树中 记录 ...

  4. iOS9 HTTP 网络访问问题

    今天升级Xcode 7.0 发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Security po ...

  5. JavaScript方面的书籍

    我要向大家推荐两本js方面的书: <JavaScript权威指南> <JavaScript高级程序设计>适合想在js方面有所提高的开发人员 我们读书是为了什么? 有的人可能是兴 ...

  6. Unix 让进程安全地退出

    终止一个进程有很多方法(暂只说linux环境):前台运行的进程,如果没有提供退出功能,我们通常会Ctrl+C进行终止:后台或守护进程,如果也没有提供退出命令啥的,咱通常会kill掉:此外还有类似关机或 ...

  7. 笔记:Jersey REST API 设计

    REST 统一接口 REST 使用 HTTP 协议的通用方法作为统一接口的标准词汇,REST 服务所提供的方法信息都在 HTTP 方法里,每一种HTTP请求方法都可以从安全性和幂等性两方面考虑,这对正 ...

  8. 剖析非同质化代币ERC721-全面解析ERC721标准

    什么是ERC-721?现在我们看到的各种加密猫猫狗狗都是基于ERC-721创造出来的,每只都是一个独一无二的ERC-721代币,不过ERC-721在区块链世界远不止猫猫狗狗,它更大的想象空间在于将物理 ...

  9. Python 中 Iterator(迭代器)和Iterable(迭代对象)的区别

    直接可以用作for循环的数据类型有以下几种: tuple.list.dict.str等, 上述数据类型可以用作for循环的叫做可迭代对象Iterable.可以使用isinstance判断一个对象是否是 ...

  10. 设计模式 --> MVC,MVP 和 MVVM 的图示

    MVC,MVP 和 MVVM 的图示 复杂的软件必须有清晰合理的架构,否则无法开发和维护.MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用. 一.MVC M ...