- Hibernate 教程
- Hibernate - 首页
- ORM - 概述
- Hibernate - 概述
- Hibernate - 架构
- Hibernate - 环境配置
- Hibernate - 配置
- Hibernate - 会话 (Sessions)
- Hibernate - 持久化类
- Hibernate - 映射文件
- Hibernate - 映射类型
- Hibernate - 例子
- Hibernate - O/R 映射
- Hibernate - 级联类型
- Hibernate - 注解
- Hibernate - 查询语言 (HQL)
- Hibernate - Criteria 查询
- Hibernate - 原生 SQL
- Hibernate - 缓存
- Hibernate - 实体生命周期
- Hibernate - 批量处理
- Hibernate - 拦截器
- Hibernate - ID 生成器
- Hibernate - 保存图片
- Hibernate - log4j 集成
- Hibernate - Spring 集成
- Hibernate - Struts 2 集成
- Hibernate - Web 应用
- 映射表示例
- Hibernate - 基于层次结构的表映射 (Table Per Hierarchy)
- Hibernate - 基于具体类的表映射 (Table Per Concrete Class)
- Hibernate - 基于子类的表映射 (Table Per Subclass)
- Hibernate 有用资源
- Hibernate - 问答
- Hibernate - 快速指南
- Hibernate - 有用资源
- Hibernate - 讨论
Hibernate - 保存图片
我们经常需要将图片或大型文档保存到数据库中。数据库提供将字符或图像文件作为BLOB(二进制大型对象)或CLOB(字符大型对象)保存的功能。在数据库中,类型通常为BLOB/LONGBLOB, LONGTEXT 等。
为了指示实体具有一个需要存储为BLOB,CLOB的字段,可以使用@Lob注解。例如,考虑以下代码片段:
@Entity
@Table(name = "save_image")
public class LobEntity {
...
@Lob
@Column(name = "image")
private byte[] image;
...
}
让我们详细讨论一下在Hibernate中保存图片,并通过一个例子进行说明。
创建映射类
让我们创建一个POJO类,其数据将持久化到数据库中。
LobEntity.java
package com.tutorialspoint;
import javax.persistence.*;
@Entity
@Table(name = "save_image")
public class LobEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Lob
@Column(name = "image")
private byte[] image;
public byte [] getImage() {
return image;
}
public void setImage(byte[] imageData) {
this.image = imageData;
}
}
创建Hibernate配置文件
现在创建一个Hibernate配置文件,用于数据库和其他细节。
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 5.3//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hbm2ddl.auto">update</property>
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="connection.url">jdbc:mysql:///TUTORIALSPOINT</property>
<property name="connection.username">root</property>
<property name="connection.password">guest123</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<mapping class="com.tutorialspoint.LobEntity"/>
</session-factory>
</hibernate-configuration>
注意,在文件中,mapping元素使用class而不是resource。并且将hbm2ddl.auto属性设置为update会自动创建表(如果表不存在)。
创建应用程序类
最后,我们将创建一个包含main()方法的应用程序类来运行应用程序。我们将使用此应用程序来测试基于层次结构的表映射。
SaveBlob.java
package com.tutorialspoint;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import java.io.*;
public class SaveBlob {
public static void main(String[] args) throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream("C:\\Users\\Saikat\\OneDrive\\Pictures\\almoural_castle.jpg");
byte[] bytes = new byte[fis.available()];
StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
Metadata meta = new MetadataSources(ssr).getMetadataBuilder().build();
SessionFactory factory = meta.getSessionFactoryBuilder().build();
Session session = factory.openSession();
Transaction t = session.beginTransaction();
LobEntity lob = new LobEntity();
lob.setImage(bytes);
session.save(lob);
session.getTransaction().commit();
fis.close();
System.out.println("Successfully inserted image in table.");
}
}
编译和执行
执行SaveBlob二进制文件以运行程序。
输出
您将得到以下结果,并且记录将被创建到save_image表中。
$java SaveBlob Successfully inserted image in table.
如果您检查您的save_image表,它应该包含以下记录:
mysql> select id from save_image; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) mysql> desc save_image; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | image | longblob | YES | | NULL | | +-------+----------+------+-----+---------+----------------+ 2 rows in set (0.00 sec)
广告