Hibernate持久化类和Hibernate持久化对象状态
一、持久化对象po类
1、po定义
PO,是Persistent Object的缩写,是持久化类。PO是由PO=POJO+hbm映射配置组成。
2、通俗理解
PO类即持久化类,其实就是一个普通的JavaBean,只是要申明遵循一定的规则就是一个PO类。
在Hibernate框架中,采用的面向对象的思想实现数据库的CRUD操作.在数据库中每一个表就有一个对应一个持久化对象。PO类可以看成,与数据库表相映射的Java实体对象。最简单的PO类中的属性对应数据库中表的字段名。
//演示如何创建一个po实体类
package cn.it.po; import java.util.Date; //1、定义类实体类 public class Book { //2、定义标识属性 oid private Integer id; private String name; private Double price; private Date publish; //2、空参的构造方法 public Book(){ } //3、创建参数的set/get方法 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public Date getPublish() { return publish; } public void setPublish(Date publish) { this.publish = publish; } }
对于hibernate中的PO编写规则:
1)在PO类必须提供一个标识属性,让它与数据库中表的主键对应,我们管这个属性叫OID (简单说,PO就是与数据库中主键对应的标识属性)
2)类的所有属性要private, 对外提供public(共有的)的get/set方法
3)必须提供一个无参数的public构造方法
4)PO类中的属性尽量使用基本数据类型的包装类.
因为基本数据类型都有自己默认值,而基本类型包装类型的默认值是null,那么我们执行插入数据操作时,如果我们没有给指定的属性赋值,那么它们插入到数据中的默认数据类型是不一样的。
之前我们谈到了hibernate持久化对象的状态,那么下面来进行一个详细的分析和理解。
二、Hibernate持久化对象状态
持久化类类三种状态介绍:临时状态,持久状态,脱管状态。
1.瞬时态
瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,例如: Book bookop = new Book();它不存在OID,与hibernate中的session无关联
,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。
简单说:无OID 与数据库中的信息无关联,不在session管理范围内。
(1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
(2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,delete()方法从数据库中删除
与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。
2.持久态
2.持久态:在hibernate session管理范围内,它具有持久化标识OID它的特点,在事务未提交前一直是持久态,
当它发生改变时,hibernate是可以检测到的。简单说:有OID 由session管理,在数据库中有可能有,也有可有没有。
1) Session的save()方法把临时对象转变为持久化对象。
2) Session的load()或get()方法返回的对象总是处于持久化状态。
3) Session的find()方法返回的List集合中存放的都是持久化对象。
4) Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。
5)当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。
3,脱管态:
托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,
也有可能不存在。对于托管态对象,它发生改变时hibernet不能检测到。
三、持久化类三种状态切换
1.瞬时态
瞬时------>持久 save() saveOrUpdate
瞬时------>脱管(游离) 手动设置oid
2..持久态 它是由session管理
持久------>瞬时 delete() 被删除后持久化对象不在建议使用
持久------>脱管 注意:session它的缓存就是所说的一级缓存
evict(清除一级缓存 中指定的一个对象)
clear(清空一级缓存)
close(关闭,清空一级缓存)
3..脱管态 (它是无法直接获取)
脱管----->瞬时 直接将oid删除
脱管----->持久 update() saveOrUpdate() lock(过时)