Hibernate框架学习之二:深入理解持久化对象

前言

由于Hibernate框架是一个完全的ORM框架,所以在Hibernate开发中只涉及具体的对象与属性,所以对象在Hibernate中是很重要的方面。而持久化对象则与数据库中的记录息息相关了,可以简单把持久化类理解为普通的JavaBean,也被称为POJO(Plain Old Java Object),在Hibernate3中,持久化类的定义与普通JavaBean的定义基本一致,而不需要额外实现其他接口或者继承某个类。

但是使用要想是一个普通的POJO与数据库对应起来还需要映射的配置(这点后面会继续介绍)。持久化类的要求有以下几个:

  • 提供无参的构造方法
  • 提供一个对象表示属性,就是数据库中的主键(一般是id),在Hibernate中并没有强制要求对象表标识属性的数据类型,但是在开发中默认使用8种基本数据类型作为对象的表示属性。
  • 为属性提供set和get方法
  • 在必要的时候重写equals和hashCode方法。这里所谓必要的时候是指在需要把对象实例保存到集合对象中的时候。这种情况一般发生在映射的时候。我们知道重写这两个方法是为了对象标识符的比较,从而确定是否是同一个对象。

持久化对象的三种状态

下面是这三种状态的基本转换图:

下面对该图的转换过程进行简要的说明:

当创建有一个持久化对象的时候(使用new关键字),还不是持久态(Persistent State),这个时候因为还没有与具体的Session关联(运用JVM的相关的知识解释是没有GC Roots节点与该对象存在引用链关系),所以还是瞬时态(Transient State)。
这个对象与Session关联之后(可以理解为GC Roots节点就是Session对象),通过调用Session的save、persist等方法可以让一个瞬时态的对象转换为一个持久态的对象。一个持久态的对象在Session关闭后就会变为游离态(Detached State),这里可能有个疑问是,为什么Session关闭之后不是变为 瞬时态呢?因为处于游离态的对象是可以被新的Session重新持久化的。这点与瞬时态还是不同的,因为瞬时态的对象如果没有雨Session发生引用,那么只能被GC,而游离态的对象还有第二个选择。当然,如果游离态的对象仍然一直没有雨Session发生引用,那么也最终被JVM的垃圾回收机制GC的。
处于持久态的对象通过调用Session的evict或者clear方法(这这两个方法在Hibernate缓存策略中会使用到)会使得一个对象有持久太变为游离态。
注意到,上面还有一种删除态,在Hibernate官方中是没有这种状态的,这里只是为了表示对象被删除这个过程。

持久化状态改变的方法

通过上面的叙述,基本对象Hibernate对象的三种状态有了一个大体的认识,现在叙述改变对象的方法。

由上图可知,在一个对象被创建出来的时候,是瞬时态的。为了让一个对象变为持久态,可供调用的方法是:

  • Serializable save(Object obj):将obj变为持久态,并保存到数据库
  • Serializable save(Object obj,Object pk):在保存对象的时候指定主键,并保存到数据库中。会将对象变为持久态
  • void persist(Object obj):将对象持久化到数据库,没有返回值
  • void persist(Object obj,Object pk):在保存对象的时候指定主键,会把对象变为持久态

前面的save方法是Hibernate框架提供的,persist是JPA提供的,两者在使用上的区别在于:执行save方法的时候会产生一个返回值,这个时是对象的标识属性,执行persist方法是不会产生返回值的。此外,save方法在执行的时候会立即执行一条insert语句把对象保存到数据库中,而执行persist方法是不会的,在外部事务调用该方法的时候不会立即生成一条sql语句。因为在执行一个事务的时候往往是具有ACID性质的,如果立即生成sql语句则不能保证事务的原子性。

时间: 2025-01-27 03:18:20

Hibernate框架学习之二:深入理解持久化对象的相关文章

Hibernate框架学习之一:Hello World程序

前言 对一个框架的直观认识,往往是从一个Hello World程序开始.Hibernate是一个ORM(Object Relationship Mapping)对象映射框架.实现了JDBC轻量级的封装,使得在进行JDBC开发的时候可以直接使用面向对象的思维进行开发,说白了Hibernate框架的作用是在Java对象与关系数据库中做了一个映射,使得程序员不用再使用各种SQL了.所以总结Hibernate以下几点: 1.完成了对JDBC的封装,不用再与各种Connection打交道了 2.在业务体系

Hibernate框架学习之三:深入映射文件的配置

前言 这里主要是对XML版的Hibernate框架的开发进行说明,Annotation版会在另外的文章中在说明.由于Hibernate是一个全方位的ORM框架,那么要实现从Object到Record的完全过渡,实现的桥梁就是这里要讲的映射文件了.映射文件的内容繁多,主要是以开发中会使用到的为主进行说明.大体说来,映射文件主要是对class的映射,还包括属性,属性有分为主键.普通属性与集合属性,甚至还有复合类型等.每种属性都需要进行不同的配置,官方文档看得有点累,所以这里一并做一个总结. 映射文件

Hibernate框架学习之四:关联映射那些事

前言 Hibernate关联关系与客观世界中具体的映射关系很类似,在进行数据库设计的时候常常需要考虑是一对多.多对一等类似的映射关系,这其中涉及数据库设计方面的知识.映射关系可以分为单向与双向两种,具体又包括一对多.多对一.一对一以及多对多四种.所以总共有八种映射关系.这里只介绍了XML配置文件的版本. 下面的配置文件的配置方式都以下面的两个持久化类作为模板: public class Person { private int id; private String name; private i

Struts2框架学习之二:action详解

前言 在struts 2中,action是其核心功能,使用struts 2框架,主要的开发都是围绕action进行的,我们编写的action通常需要实现com.opensymphony.xwork2.Action接口,需要实现的方法是execute方法,但是在实际的开发中,编写的action也可以不必实现action接口,而是直接创建一个普通Java类,并添加execute方法就可以public String execute(){return "success";}.还有一种方式是集成

【HIBERNATE框架开发之二】第一个HIBERNATE-ANNONATION项目(采用@ENTITY、@ID直接映射实体类)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/789.html 紧接上一篇,这里Himi直接copy上一篇创建的HelloHibernate项目,然后改名为:HelloAnnonation,Ok:  OK,准备工作: 首先第一步,继续再我们自定义的user libraries 中添加Annotation所需的包,如下3个jar包(共11个包):            

使用hibernate扩展工具hbm2java根据配置文件生成持久化对象类(2.1.2)

对象 使用hbm2java生成代码是非常容易的,比hibernate提供的schemaExport(配置文件到数据库)的使用容易得多.真不知道作者怎么搞的,把个schemaExport写得这么难...... 1.开始前的准备  1.1 准备hibernate-2.1.6.zip  1.2 准备hibernate-extensions-2.1.2.zip  1.3 准备logging-log4j-1.2.9.zip  1.4 把相关.jar文件全部复制到工程目录之下的lib目录  1.5 知道如何

Struts2框架学习之六:理解并使用拦截器

前言 拦截器是Struts2框架的核心功能,理解并使用拦截器有助于更灵活使用Struts2.拦截器与Servlet中的过滤器有些类似却又不尽相同.因为在Struts2中拦截器更像一个可插拔的组件,围绕Action和Result进行,可以在方法调用之前.之后使用.通过Struts2的工作流程(后面还会看到一个请求在Struts2中详细的执行流程)可以发现调用一个Action之前之后有许多的拦截器,这些拦截器都通过后才执行具体的action.对于每一个拦截器来说,可以直接返回,从而终止余下的拦截器.

Hibernate学习(二)Hibernate中Session之get和load方法的真正区别

最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入很大.主要是对get方法的说法跟实际运行的结果不一致. 先说一下观点吧: get不支持lazy,load支持lazy: 数据不存在时,get返回null,load则抛出ObjectNotFoundException异常. load方法可以返回实体的代理类实例,而get方法直接读取数据库,所以直接返回

解析Java的Hibernate框架中的持久化类和映射文件_java

持久化类Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表.一个映射文件Hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域. 其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类. Hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通Java对象(POJO)编程模型.有下列持久化类的主要规则,但是,这些规则并不是必需的. 将所有的持久化Java类需要一个默认的构造函数. 所有类应该包含为了让容易识别对象内Hi