1. 概述

LOB(Large OBject)是一种用于存储大对象的变长数据类型,主要包含两种变体:

  • CLOB(Character Large Object):存储大文本数据
  • BLOB(Binary Large Object):存储二进制数据(如图片、音频、视频)

本教程将演示如何使用 Hibernate ORM 持久化大型对象。

2. 环境配置

我们使用 Hibernate 5 和 H2 数据库,需要在 pom.xml 中添加依赖:

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

✅ 最新版本可在 Maven 中央仓库获取:hibernate-coreh2

关于 Hibernate 的详细配置,可参考我们的 入门教程

3. LOB 数据模型

我们创建一个 User 实体,包含 idnamephoto 属性。其中 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 注解:指定数据库应将该属性存储为大对象
  • columnDefinition:在 @Column 中定义列类型
  • 使用 byte[] 类型对应 BLOB(二进制数据)

4. 使用示例

4.1 初始化 Hibernate Session

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

通过工具类加载 hibernate.properties 配置文件创建 Session。

4.2 创建 User 实例

假设用户上传了图片文件:

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.persist(user);

由于 User 类中声明了 @Lob 注解,Hibernate 会自动将 photo 属性以 BLOB 类型存储。

4.4 数据验证

从数据库检索数据并验证:

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

断言验证:

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 对象,确保数据一致性

5. 总结

LOB 是存储大对象的数据类型,分为:

  • BLOB:存储二进制数据(图片/音视频)
  • CLOB:存储文本数据

通过 Hibernate 映射 LOB 数据非常简单,只需:

  1. 定义正确的数据模型(使用 @Lob 注解)
  2. 配置合适的数据库表结构

💡 关键点:Hibernate 会自动处理 Java 对象与数据库 LOB 类型的转换,开发者只需关注业务逻辑即可


原始标题:Mapping LOB Data in Hibernate | Baeldung