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

来源:互联网 发布:设计软件 logo cdr 编辑:程序博客网 时间:2024/06/05 04:22

一,认识持久化对象PO:

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

PO类即持久化类,其实就是一个普通的JavaBean,只是要申明遵循一定的规则就是一个PO。

package PO;public class UserInfoPO {     private int id;     private String username;     private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}     }
定义PO遵循以下三个原则:

1,为持久化字段声明私有属性且提供getter和setter方法

2,实现一个无参构造函数。所有的持久化类都要有一个默认的构造函数,这样hibernate就可以使用newInstance()来实例化它们。

3,提供一个标识符属性。

    标识符属性,用于映射数据库表的主键字段。这个属性可以叫任何名字,其类型可以试任何原始类型,原始类型的包装类型,String或者Date。

二,持久化对象的三种状态:

Hibernate的PO对象有三种状态:临时状态,持久状态,脱管状态。

1,临时态

  由new命令开辟内存空间刚生成的Java对象就处于临时态。例如:UserInfoPO ui=new UserInfoPO();如果没有变量引用,他讲被java虚拟机回收。

  临时对象在内存中是孤立存在的,它是携带信息的载体,不和数据库的数据有任何关联关系。在Hibernate中,可通过Session的save()或saveOrUpdate()方法将临时对象与数据库相关联,并将数据插入到数据库中,此时该临时对象状变成持久化对象。

临时对象的特征。临时对象具有以下特征:
(1) 不处于Session的缓存中,也可以说,不被任何一个Session实例关联。
(2) 在数据库中没有对应的记录

(3)他们没有任何跟数据库表相关联的行为

在以下情况下,Java对象进入临时状态:
(1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。
(2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于游离对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。


2,持久态

 处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标志如果使用delete方法。对应的持久化对象就会变成临时对象。因为数据库中对应的数据已被删除,该对象不在与数据库的记录相关联。

 当session执行close()和clear()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象有数据库识别值,但不在hibernate持久层管理之下。

持久对象具有如下特点:
1)和session实例关联,位于一个Session实例的缓存中

2)在数据库中有关联记录。

Session的许多方法都能够触发Java对象进入持久化状态:
(1) Session的save()方法把临时对象转变为持久化对象。
(2) Session的load()或get()方法返回的对象总是处于持久化状态。
(3) Session的find()方法返回的List集合中存放的都是持久化对象。
(4) Session的update()、saveOrUpdate()和lock()方法使游离对象转变为持久化对象。
(5)当一个持久化对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时会把这个临时对象也转变为持久化对象。


3,脱管态:

某持久化对象的session被关闭后,持久化对象就变成了脱管对象,这个对象不能再与数据库保持同步,他们不再受Hibernate管理。当脱管对象被重新关联上Session时,将再次转变成持久化对象。

脱管对象有如下特点:

1)不再位于Session的缓存中

2),因此在数据库中可能还存在与它对应的记录(前提条件是没有其他程序删除了这条记录)。

脱管对象与临时对象的相同之处:

     两者都不被Session关联,因此Hibernate不会保证它们的属性变化与数据库保持同步。

脱管对象与临时对象的区别

      前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录

当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。


总结:

临时对象-----(get,load等)------>持久对象------(close方法关闭session)------>脱管对象

临时对象:不在session缓存,没记录,get,load转变持久对象

持久对象:在session缓存,有记录

脱管对象:不在session缓存,可能有记录,有数据库标识,可通过update,saveOrUpdate等,转变持久对象。


0 0
原创粉丝点击