Hibernate是一个纯粹的O/RMapping框架,通过Hibernate的支持,程序开发者只需要管理对象的状态,无须理会底层数据库系统的细节。相当于常见的JDBC持久层方案中需要手工管理SQL语句,Hibernate采用完全面向对象的方式来操作数据库。对于程序开发者而言,眼里只有对象、属性,无须理会底层数据表、数据列等概念。

1. 持久化类的要求

虽然Hibernate对持久类滑太远的要求,但还是应该遵守如下规则:

1)        提供一个无参数的构造器:所有的持久化类都应该提供一个无参数的构造器,这个构造器可以不采用public访问控制符。只要提供了无参数的构造器,Hibernate就可以使用Constructor.newInstance()来创建持久类的实例了。通常,为了方便Hibernate在运行时生成代理,构造器的的访问控制参数符至少是包含可见的,即大于或等于默认的访问控制符。

2)        提供一个标识属性:标识属性通常映射数据库的主键字段。这个属性可以叫任何名字,其类型可以是任何的基本类型、基本类型的包装、java.lang.Sring或者java.util.Date。如果使用了数据库表的联合主键,甚至可以用一个用户自定义的类,该类拥有这些类型的属性。当然,也可以不指定任何标识属性,而是在持久化注解中直接将多个普通映射成一个联合主键,但通常不推荐这么做。

Hibernate建议使用可以为空的类型来作为标识属性的类型,因为应该尽量避免使用基本数据类型。

1)        为持久化类的每个成员变量提供setter和getter方法:Hibernate默认采用属性方式来访问持久化成员变量。

2)        使用非final的类:在运行时生成代理是Hibernate的一个重要功能。如果持久类没有实现任何接口,Hibernate使用Javassist生成代理,该代理对象是持久化类的子类的实例。如果使用了final类,则无法生成Javassist代理,将无法进行性能优化。如果非要使用一个有public final方法的类,则必须通过设置lazy=”false”来明确地禁用代理。

3)        重写equels()和hashCode()方法:如果需要把持久化类的实例放入Set中,则应该为持久化类重写equals()和hashCode()方法。实现equals()/hashCode()最显而易见的方法是比较两个对象标识属性的值。

2. 持久化对象的状态

上一章节中,笔者已经介绍过了持久化,那么这里,我们深入来了解一个持久化。Hibernate持久化对象支持如下几种的状态。

1)        瞬态:对象由new操作符创建,且尚未与Hibernate Session关联的对象被认为处于瞬态。瞬态对象不会被持久化到数据库,也不会被赋予持久化标识。如果程序中失去了瞬态对象的引用,瞬态对象将被垃圾回收机制销毁。使用Hibernate Session可能将其变为持久化状态。

2)        持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识(idebtifier).持久化的实例可能是刚刚保存的,也可以是刚刚被加载的。无论哪一种,持久化对象必须与指定的Hibernate Session关联。Hibernate会检测到处于持久化状态对象的改动,在当前操作执行完成时将对象数据写回数据库。开发者不需要手动执行update。

3)        脱管:某个实例曾经处于持久化状态,但随着与之关联Session被关闭,该对象就变成脱管状态。脱管对象的引用依然有效,对象可继续被修改。如果重新让脱管对象与Session关联,这个脱管对象会重新转换为持久状态,而脱管期间的改动不会丢失,也可以被写入数据库。正是因为这个功能,逻辑上长事务成为可能,它被称为应用程序事务,即事务可以跨越用户的思考,因为当对象处于脱管状态时,对该对象的操作无须锁定数据库,不会造成性能的下降。

下面显示Hibernate持久化对象演化图。

3. 总结

理解Hibernate的持久化的三个状态,我助于自己对于JavaBean对象的状态的认识,及自己对数据的操作。在操作中也可更好地优化程序。当然,对于持久化对象状态的方法,我们将在下一节中讲解。在这之前,希望读者可以更好地理解持久化的三种状态。

Hibernate之持久化对象相关推荐

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

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

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

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

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

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

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

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

  5. Hibernate持久化对象状态

    在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 解决fixed在苹果手机抖动问题/头部底部固定布局
  2. Ubuntu安装Sublime Text并输入中文
  3. spring的PathMatchingResourcePatternResolver基于ant通配符匹配路径遍历项目所有xml文件
  4. 895计算机专业基础,2017北京工业大学895计算机学科专业基础考研入学考试大纲...
  5. Source Insight中的正则表达式和快捷键
  6. python内置函数用来打开或创建文件并返回文件对象_python内置函数
  7. xp给指定计算机共享,WinXP系统设置访问共享提示指定网络名不可用怎么解决
  8. java 同比环比_数据相关概念同比,环比
  9. 求最小公倍数(扩展版)
  10. 阿里云虚拟机【yum】命令出现错误
  11. 2021.10.25-10.31 AI行业周刊(第69期):AI进化之路
  12. Nginx 实现文件夹上传(保留目录结构)
  13. sqlDbx连接mysql 及乱码
  14. peel在Linux生成excel,如何将多个Excel文件合并成一个且保留原有数据?
  15. python中小学示范课_Python正课72 —— 继承
  16. 中软国际java面试题及参考答案
  17. 轻听-最好的解压助眠医疗轻音乐集
  18. GitHub也能CI/CD了 如何使用GitHub的Action?
  19. IC高级工程会议——DVCon中国2019欢迎您的论文投稿!
  20. 工业控制系统安全需求的变化

热门文章

  1. 逆向libbaiduprotect(二)
  2. Java中将16进制字符串转换成汉字
  3. android 抓包 2
  4. 常用计算机名词解释,计算机常用名词解释
  5. 二叉树的镜像(C++)
  6. java接口之双端队列
  7. 数组中只出现一次的数字(python解法)
  8. WPF 使用附加属性增加控件属性
  9. 一个极简的RePlugin
  10. 凑算式——第七届蓝桥杯C语言B组(省赛)第三题