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-core 和h2 。
如需更深入地了解如何配置 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对象,以将其与插入的数据进行比较。
由于我们知道插入的User的id,我们将使用它从数据库中检索数据:
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对象将具有与插入数据相同的信息。