持久化是将程序数据在持久化状态和瞬时状态间转换的机制,持久化类可以被hibernate保存到数据库并且从数据库中读取的类。简而言之,一个对象一旦被持久化了,那么这个对象的某个属性一旦改变了,数据库中的属性也会随之改变,所以这样就可以让程序员做到采用完全面向对象的方式来操作数据库了,而无需管理数据库的一些操作。

不过一个类要持久化,也是要有一些要求的:

(1)提供一个无参数的构造函数:Hibernate可以使用Constructor.newInstance()方法来创建实例,所以这里最好创建一个无参数的构造函数

(2)提供一个标识属性:也就是数据库表中的主键,这两者性质是一样的

另外,还需为该类提供setter和getter方法,并且该类为非final类,在需要将持久化类的实例放入Set中时,得重写equals()和hashCode()方法(这个后面介绍)。

一般的持久化类有三个状态:瞬态、持久化和脱管三个状态。

瞬态:就是使用new创建的对象但是并没有与Session对象关联的对象,这种状态不会持久化到数据库中,即这时对象的属性发生改变时并不会影响数据库中的信息。如果程序中失去了瞬态对象的引用,瞬态对象将被会回收到垃圾回收机制销毁。使用Hibernate的Session可以使其变成持久化状态。

持久化状态:这个状态就是实体类与数据库中的表进行了关联,实体类进行了改动数据库中的表也会进行改动。

脱管:某个实例之前属于持久化,但是关联Session关闭后,变成了脱管状态,这就变成了普通对象了。当然托管状态也是可以再次持久化,与Session关联后可以再次写进数据库。

下面将逐个讲解持久化的一些操作:

(1)持久化实体

为了将一个瞬态的实体变成持久化状态,Hibernate  Session提供了两个方法:Serializable save(Object  obj)和void  persist(Object obj),这两个方法都是将对象转化为持久化状态,该对象的属性将被保存到数据库里。当然save方法在之前的例子里已经用到过,这里的persist方法用法是一样的。注意:save方法和persist方法还是有一定的区别的:save方法会立即将持久化对象对应的数据插入数据库,而persist方法则保证当它在一个事物外部被调用时,并不立即转换成insert语句,这个功能在需要封装一个长会话时比较有用(后面会涉及到)。因此一般再使用持久化实体的时候就是用save就行。

(2)根据主键加载持久化实体

程序可以通过load()方法来加载一个持久化实例,这其实就相当于数据库操作的查找一样,不过这里的查找元素只能是标识属性,也就是数据库对应的主键。

使用方法:

User user2=session.get(User.class, 1);

这样可以做到查找的功能,另外也有一个方法:使用session的get()方法。两者的区别:load方法如果没有匹配到数据库记录,可能会报HibernateException异常,如果持久化注解中指定了延迟加载,则该方法会返回一个未初始化的代理对象;而get方法会立刻访问数据库,如果没有对应的记录,则返回null。

(3)更新持久化实体

实体的状态为持久化状态时,更改实体类时,数据库中就会做出相应的改变。

更新持久化实体的方法为:

User user2=session.load(User.class, 1);
user2.setName("李四");
session.flush();

注意:这里调用session对象的flush方法是将持久化实体所做的修改在flush方法之前自动保存在数据库,因此修改数据库最简单的方法就是在Session处于打开状态时load或load它,然后直接修改即可。

(4)删除持久化实体

删除持久化实例最简答的方法就是调用Session的delete方法:

 User user2=session.get(User.class, 1);session.delete(user2);

这样通过上面的四种方法以及之前介绍的例子就可以实现面向对象的数据库的增删查改的功能了。

另外,如果一个持久化对象处于脱管实体,即曾经是一个持久化对象,但是Session关闭了,也是可以将持久化,方法为:首先建立一个新的Session实例,然后调用Session的update()、merge()和updateorSave()方法。update方法会保存程序对持久化对象所做的修改;如果不清楚该对象曾经时候持久化过,则可以调用updateOrSave()方法,如果曾经持久化化过,就执行update操作,否则执行save操作。merge方法可将程序对脱管对象所做的修改保存到数据库,但不会持久化给定的对象。

Hibernate之深入理解持久化对象相关推荐

  1. hibernate中的PO持久化对象及PO三种状态

    一,认识持久化对象PO: 在hibernate的应用程序中,每一个数据库中的表都对应一个持久化对象PO.PO可以看成是与数据库表相映射的java对象.最简单的PO对应数据库中某个表中的一条记录,多个记 ...

  2. (转) Hibernate框架基础——操纵持久化对象的方法(Session中)

    http://blog.csdn.net/yerenyuan_pku/article/details/52761021 上一篇文章中我们学习了Hibernate中java对象的状态以及对象的状态之间如 ...

  3. Hibernate持久化对象的三种状态深入理解

    关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...

  4. Hibernate持久化对象生命周期之实战探索

    正所谓"工欲善其事,必先利其器",我陈述过自己的从业经历,因为并非IT科班出身,刚入职有很多不懂,由于需要快速开发,所以在还未对Hibernate有仔细的认识前,我就兼任新老系统的 ...

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

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

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

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

  7. JPA保存数据时报持久化对象异常:PersistenceException: org.hibernate.PersistentObjectException

    1. 持久化对象异常如下图所示: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: de ...

  8. Hibernate持久化对象三种状态

    持久化类类三种状态介绍 瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录.它使用完成后,会被jvm直接回收掉, ...

  9. (9) hibernate加载持久化对象的两种方式——get、load

    一.get与load对比 在hibernate中get和load方法是根据id取得持久化对象的两种方法,但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...

最新文章

  1. Spring Session源码解析
  2. Jquery的动态创建DOM元素
  3. 【渝粤教育】广东开放大学 大学英语1 形成性考核 (43)
  4. proe输入数字时成双出现_职场数据控系列,超市基础篇,商品双ABC分析法及应用...
  5. HG255D[OpenWrt]从入门到精通
  6. 数学思维游戏两则:Gabriel喇叭、世界末日论
  7. 《C++ Primer 第5版》源码下载地址
  8. 核磁谱图分析步骤_核磁共振解析图谱的步骤
  9. 20多年老码农的IT学习之路
  10. 西湖论剑2020writeup
  11. 有钱任性的农夫山泉,被迫踏上IPO?
  12. HTTPS双向认证(Mutual TLS authentication)
  13. 棋牌游戏服务器开发心得
  14. Mac Parallels Desktop 安装 Centos 虚拟机
  15. Oracle (1) :服务端和客户端的安装与配置
  16. python网络编程 赵宏_2018年Python爱好者社区历史文章合集(作者篇)
  17. 【Antv/Vue3】vue项目中使用antv/L7制作地图
  18. 第三方快递鸟免费物流轨迹单号查询api接口对接案例
  19. (一)永磁同步电机矢量控制(三电平)——浅谈三电平逆变器
  20. pythonimportpath_python import搜索路径与重新导入

热门文章

  1. 清华大学(软件学院)-中国核能电力股份有限公司 数字核电技术联合研究中心成立...
  2. python怎么测试opencv安装是否成功_学习笔记:自己编译安装OpenCV+测试opencv安装是否成功...
  3. Latex基于longtable环境设置跨页表格,且固定表格宽度、支持跨页标题显示
  4. Seq2Seq Model(序列到序列模型)
  5. 编译原理之 短语直接短语句柄 定义与区分
  6. 遴选国际一流期刊的评价指标
  7. 链表基本操作的函数实现。(1)
  8. 国耻日,各大门户网站.
  9. 基于stm32电子时钟设计
  10. 开课吧python怎么样-廖雪峰官方大数据分析课程,第七期对外开放,前20名直降2000元!!!...