在Hibernate5的应用程序中,每一个数据库中的表都对应一个持久化对象(PO)。持久化对象可以看成是与数据库表相映射的Java对象。最简单的持久化对象对应着数据库中某个表中的一条记录,多个记录可以对应持久化对象的集合。持久化对象中不应该包含任何对数据库的操作。
我可以举一个例子:
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;
}
}
上面就是一个持久化对象,该持久化对象对应着数据库中的info表,info表有3个字段:id(int类型)、userName(varchar类型)和password(varchar类型)。定义持久化对象应遵循以下三个规则:
- 为持久化字段声明私有属性且提供getter和setter方法。
- 实现一个无参的构造方法。
- 提供一个标识符属性。
下面我再来说一说Hibernate5的持久化对象的状态。
Hibernate5的持久化对象有三种状态:临时状态(临时态)、持久状态(持久态)和脱管状态(脱管态)。
1、临时态
由new命令开辟内存空间刚生成的Java对象处于临时态。
例如:UserInfoPO ui=new UserInfoPO();
临时对象在内存中是孤立存在的,它是携带信息的载体,不和数据库的数据有任何关联关系。
2、持久态
处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标记。如果使用Hibernate5的delect()方法,对应的持久化对象就变成临时对象,因数据库中的对应数据已被删除,该对象不在于数据库的记录关联。
当一个Session执行close()或clear()之后,持久对象会变成脱管对象。此时该对象虽然具有数据库识别值,但它已不再Hibernate5持久层的管理之下。
持久化对象具有如下特点:
- 与Session实例关联
- 在数据库中由于它关联的记录。
3、脱管态
当与某持久对象关联的Session被关闭后,该持久对象转变为脱管状态。当脱管状态被重新关联到Session上时,将再次转变成持久状态。
脱管状态拥有数据库的标识值,可通过update()、saveOrUpdate()、lock()方法等方法,转变成持久对象。
脱管对象具有如下特点:
- 本质上与临时状态相同,在没有任何变量引用它时,JVM会在适当的时候将它回收。
- 比临时状态多了一个数据库记录标识值。