Hibernate 的体系
- Transient Object(瞬时态对象):持久化类的没有与 Session 相关联的实例。
- Persistent Object(持久化对象):带有持久化状态、具有业务功能的单线程对象。这些对象是与唯一的 Session 相关联的普通的 JavaBean 或 POJO。
- SessionFactory:生成 Session 的工厂,负责创建 Session 对象。
Hibernate 的执行流程
获得实体类
Hibernate 提供的常用的主键生成策略:
- increment:对象标识符由 Hibernate 以递增方式生成,如果有多个应用实例向同一张表插入数据时,则会出现重复的主键,应当谨慎使用。
- identity:对象标识符由底层数据库的自增主键生成机制产生,要求底层数据库支持自增字段类型。(适用于 MySQL)
- sequence:对象标识符由底层数据库的序列生成机制产生,要求底层数据库支持序列。(Oracle,DB2)
- hilo:对象标识符由 HIbernate 按照 高/低位 算法生成,该算法从特定表的字段读取高位值,默认情况下选用 hibernate_unique_key 表的 next_hi 字段,高/低位 算法生成的标识符仅在一个特定的数据库中是唯一的。
- native:根据底层数据库对自动生成标识符的支持能力,选择 identity、sequence 或 hilo。适合于跨数据库平台的开发。
- assigned:对象标识符由应用程序产生,如果不指定
节点,则默认使用该生成器策略。
编写 Hibernate 配置文件
Hibernate 配置文件反映了 Hibernate 连接的数据库的相关信息,”hibernate.cfg.xml”。
编写会话工厂类 HibernateSessionFactory
在 HibernateSessionFactory 类中,首先通过一个静态代码块来启动 Hibernate。在静态代码块中通过创建的 Configuration 对象并调用其 configure() 方法读取 Hibernate 配置文件。
总结
通过 HIbernate 实现了以面向对象的方式对数据库进行操作,即把对数据表和字段的操作转变为对实体类和属性的操作。在这一过程中,HIbernate 对象经历了状态的变迁。Hibernate 的对象有 3 种状态,分别为:瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。
由 new 关键字创建的对象,如果它与数据库中的数据没有任何关联,也没有通过 Session 实例进行任何持久化操作,则该对象处于瞬时态。
在 Hibernate 中通过 Session 的 save() 和 saveOrUpda() 方法,可以将瞬时对象转变为持久态对象,同时将对象中所携带的数据插入到数据库表中。处于持久态的对象在数据库中具有相应的记录,并且拥有一个持久化标识。持久态对象位于一个 Session 实例的缓存中,即总是与一个 Session 实例相关联。当 Session 清理缓存时,会根据持久态对象的属性的变化,同步更新到数据库中。
持久态对象的相关联的 Session 实例执行 delete() 方法后,持久态对象将转变为瞬时态,同时删除数据库相应的数据记录,该对不再与数据库的记录相关联。
当持久态对象的相关联的 Session 实例执行 close()、clear() 方法或 evict() 方法后,持久态对象将转变为脱管态。此后,如果 user 对象中属性值发生变化,Hibernate 不会再将变化同步到数据库中。
脱管态对象如果不再被任何对象引用,将很快被回收。如果重新关联到 Session 上,脱管态对象将再次转变为持久态。脱管态对象具有数据库标识,可以使用 Session 的 update() 或 saveOrUpdate() 方法将脱管态对象转变为持久态。