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-core 和 h2
关于 Hibernate 的详细配置,可参考我们的 入门教程。
3. LOB 数据模型
我们创建一个 User
实体,包含 id
、name
和 photo
属性。其中 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 数据非常简单,只需:
- 定义正确的数据模型(使用
@Lob
注解) - 配置合适的数据库表结构
💡 关键点:Hibernate 会自动处理 Java 对象与数据库 LOB 类型的转换,开发者只需关注业务逻辑即可