• 中文
    • English
  • 注册
  • 查看作者
  • Spring Boot「22」使用 Hibernate & JPA 持久化 Java 对象

    Hibernate 是业界名气非常大的一款 ORM(Object/Relational Mapping)解决方案。ORM 是指将 Java 中的域模型映射到关系数据库的数据模型。Hibernate 能够很好的处理从 Java 类到数据库表的映射,以及从 Java 数据类型到 SQL 数据类型的映射。接下来,我们将一块学习下如何使用 Hibernate 进行数据持久化。

    在开始之前,我们先定义一个域类型 Event,用来表示需要持久化的对象。

    01-使用 Hibernate 原生 API

    在 Hibernate 原生 API 中,提供数据持久化能力或接口的是
    。Hibernate 提供了一个工厂类
    ,用来创建 Session 对象,

    在 Hibernate 的早期版本中,需要使用 hibernate.cfg.xml 搭配 hbm.xml 文件来配置对象持久化。随着语言的发展,hbm.xml 逐渐被
    注解等替代。接下来,我们将逐一学习这两种方式,注意体会两者的不同。

    01.1-原生 API 和 hbm.xml

    首先,我们先介绍下用到的 hibernate.cfg.xml,它是用来配置 SessionFactory 行为的。

    是用来设置诸如使用得数据库类型、数据库驱动类、数据库链接、用户、密码等属性的。
    主要是用来引入需要用到的 hbm.xml 文件,其中定义了 Java 类与数据库表的映射关系。例如:

    标签指定了要映射的类、其映射的表及它们之间具体的映射关系(

    )。

    配置好上述文件,即可对使用 Hibernate 原生 API 持久化 Java 对象进行测试了。

    通过 SessionFactory 创建的 Session 对象提供了持久化数据相关操作的主要接口,例如 persist / find 等。例如,我们向通过 Session 持久化两个对象,则可以这样实现:

    01.2-原生 API 和
    注解

    除了像 hbm.xml 文件这种表述映射关系的方式外,Hibernate 还支持使用
    /
    /
    等注解方式实现。接下来我们将看一下如何实现。

    首先,在 Java 类上增加对应的注解,以下注解等价于上节中的 Event.hbm.xml 中描述的映射关系。

    与 hbm.xml 中的
    作用是一样的。

    等价于

    然后,需要修改下 hibernate.cfg.xml 中的
    内容,将 resource 替换为 class,如下:

    之前使用的创建 SessionFactory 和 Session 的代码不用改变。运行程序后,发现数据被持久化到了数据库中。

    02-使用 Hibernate JPA API

    JPA(Java Persistence API)是一个规范,通过提供 ORM 功能,使开发者能够利用 Java Domain Model 控制关系数据库。JPA 仅是一个规范,目前业界有几种不同的实现,例如 Hibernate、EclipseLink、TopLink、Open JPA 等。Spring Boot2 默认使用 Hibernate 作为底层实现。

    JPA 中定义的启动流程与 Hibernate 原生的方式不太一样。JPA 使用 META-INF/persistence.xml 作为配置文件。而且 JPA 中定义了持久化单元和 EntityManger 的概念,与 Hibernate 原生也不太一样。

    不过,从使用方式上来看,org.hibernate.Session 和 javax.persistence.EntityManager 都表示处理持久化数据的上下文,称为”持久化上下文”。持久化数据具有一个与持久化上下文和底层数据库都有关系的状态,称为实体状态,共有以下几种取值:

    • new/transient,指实体刚被实例化,尚未与持久化上下文关联。它在数据库中没有持久化表示,也没有分配标识符(identifier)值。

    • managed/persistent,指实体具有关联的标识符,且与持久化上下文关联。

    • removed,指计划被数据库删除的 managed/persistent 状态的实体。

    • detached,指实体具有关联的标识符,但却不再与持久化上下文关联。造成实体处于这种状态通常有两种常见原因:其一,持久化上下文被关闭;其二,实体从上下文中被擦除。

    实体的标识符如何产生,参考之前的文章

    02.1-使用 persistent.xml

    前节中的例子,如果要使用 JPA 方式,需要做如下的修改。首先,先定义一个 persistent.xml 文件,其中定义了持久化单元。

    可以看出,持久化单元中的
    与 hibernate.cfg.xml 中的
    是等价的。

    然后,需要创建 EntityManager。类似地,JPA 中也通过 EntityManagerFactory 的方式生成 EntityManager。

    得到 EntityManager 对象后,使用方式与 Hibernate 中的 Session 类似:

    02.2-使用程序化方式

    根据上一小节的介绍,需要用到 persistent.xml 作为启动 JPA 的配置文件。除此之外,也可完全采用 Java 方式启动 JPA。

    采用程序化方式启动 JPA 需要借助 PersistenceUnitInfo 接口,它定义了一系列的方法能够获得创建 EntityMangerFactory 必要的信息。例如,以下 Java 类提供的信息与上小节的 persistent.xml 信息等价:

    创建 EntityManagerFactory 时与上节中的方式也略有不同。

    创建完毕后,获得 EntityManager 的方式和后续 EntityManger 的使用方式上与之前的并无差别。

  • 0
  • 0
  • 0
  • 283
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: