Contents

Hibernate 中LOB数据简介

1. 概述

LOB 或大对象是指用于存储大对象的可变长度数据类型。

数据类型有两种变体:

  • CLOB——字符大对象将存储大文本数据
  • BLOB——二进制大对象,用于存储图像、音频或视频等二进制数据

在本教程中,我们将展示如何利用 Hibernate ORM 来持久化大对象。

2. 设置

例如,我们将使用 Hibernate 5 和 H2 数据库。因此,我们必须在pom.xml中将它们声明为依赖项:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.12.Final</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.196</version>
</dependency>

最新版本的依赖项位于Maven中hibernate-coreh2

如需更深入地了解如何配置 Hibernate,请参阅我们的一篇介绍性 文章。

3. LOB 数据模型

我们的模型*“User”具有 id、name 和 photo 作为属性。我们将在User*的 photo 属性中存储一个图像,并将其映射到一个 BLOB:

@Entity
@Table(name="user")
public class User {
    @Id
    private String id;

    @Column(name = "name", columnDefinition="VARCHAR(128)")
    private String name;

    @Lob
    @Column(name = "photo", columnDefinition="BLOB")
    private byte[] photo;
    // ...
}

@Lob注解指定数据库应该将属性存储为大对象。@Column注解中的columnDefinition定义了属性的列类型。

因为我们要保存字节数组,所以我们使用BLOB

4. 用法

4.1. 启动休眠会话

session = HibernateSessionUtil
  .getSessionFactory("hibernate.properties")
  .openSession();

使用助手类,我们将使用hibernate.properties文件中提供的数据库信息构建 Hibernate 会话。

4.2. 创建用户实例

假设用户将照片作为图像文件上传:

User user = new User();

InputStream inputStream = this.getClass()
  .getClassLoader()
  .getResourceAsStream("profile.png");
if(inputStream == null) {
    fail("Unable to get resources");
}
user.setId("1");
user.setName("User");
user.setPhoto(IOUtils.toByteArray(inputStream));

我们使用Apache Commons IO 库的帮助将图像文件转换为字节数组,最后,我们将字节数组分配为新创建的User对象的一部分。

4.3. 持久化大对象

通过使用Session存储User,Hibernate 会将对象转换为数据库记录:

session.persist(user);

由于在类User上声明了*@Lob注解,Hibernate理解它应该将“照片”属性存储为BLOB*数据类型。

4.4. 数据验证

我们将从数据库中检索数据并使用Hibernate将其映射回Java对象,以将其与插入的数据进行比较。

由于我们知道插入的Userid,我们将使用它从数据库中检索数据:

User result = session.find(User.class, "1");

让我们将查询结果与输入User的数据进行比较:

assertNotNull(
  "Query result is null", 
  result);
 
assertEquals(
  "User's name is invalid", 
  user.getName(), result.getName() );
 
assertTrue(
  "User's photo is corrupted", 
  Arrays.equals(user.getPhoto(), result.getPhoto()) );

Hibernate 将使用注解上的相同映射信息将数据库中的数据映射到Java对象。

因此,检索到的User对象将具有与插入数据相同的信息。