我们已经知道,在所有的ORM框架中有一个非常重要的媒介,PO(Persistent Object,持久化对象)。持久化对象的作用是完成持久化操作,简单地说,通过该对象可以对数据执行增、删、改的操作------以面向对象的方式操作数据库。
应用程序无须直接访问数据库,甚至无须理会底层数据库采用的是何种数据库------这一切对应用程序完全透明,应用程序只需创建、修改、删除持久化对象即可;与此同时,Hibernate则负责把这种操作转换为对指定数据表的操作。
Hibernate里的PO是非常简单的,Hibernate采用低侵入式的设计,完全采用普通Java对象作为持久化对象使用,看下面的POJO:
public class User {
private int id;
private String name;
private int age;
private boolean married;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
}
这个普通的JavaBean还不具备持久化操作的能力,为了使其具备持久化操作的能力,Hibernate采用XML映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="db.domain">
<class name="User" table="users">
<id name="id" type="integer">
<generator class="native"></generator>
</id>
<property name="name" type="string">
<column name="name"></column>
</property>
<property name="age" type="integer">
<column name="age"></column>
</property>
<property name="married" type="yes_no">
<column name="married"></column>
</property>
</class>
</hibernate-mapping>
每个class元素映射一个PO,我们可以有下面的总结:
PO = POJO + XML映射文件
PO只有在Session的管理下才可以完成对数据库的访问。使用Hibernate进行持久化操作,通常有如下操作步骤:
① 开发持久化类,由POJO加映射文件组成
② 获取Configuration
③ 获取SessionFactory
④ 获取Session,打开事务
⑤ 用面向对象的方式操作数据库
⑥ 提交事务,关闭Session
根据Session与PO的关联关系,PO可有如下3种状态:
状态 | 说明 |
瞬态 | 如果PO实例从未与Session关联过,该PO实例处于瞬态。 |
持久化 | 如果PO实例与Session关联起来,且该实例对应到数据库记录, 则该实例处于持久化状态。 |
脱管 | 如果PO实例曾经与Session关联过,但因为Session的关闭等原因,PO实例脱离了Session的管理,这种状态称为脱管状态。 |
Hibernate中的Session:
它是应用程序与持久储存层之间交互操作的一个单线程对象,所有的持久化对象都必须在Session的管理下才可以进行持久化操作。Session持有一个必选的一级缓存,显式执行flush之前,所有持久化操作的数据都在缓存中。