You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将二进制文件插入数据库:基于Hibernate重写JDBC插入SQL语句

用Hibernate重写JDBC二进制文件插入逻辑

没问题,我帮你把这段JDBC的二进制文件插入逻辑转换成Hibernate实现,分两部分来完成:

1. 定义对应数据库表的实体类

首先需要创建一个映射KNOWLEDGEBASE_FILES表的实体类,Hibernate通过ORM操作数据库,实体类是核心载体:

import javax.persistence.*;

@Entity
@Table(name = "KNOWLEDGEBASE_FILES")
public class KnowledgebaseFile {

    @Id
    @Column(name = "ID")
    private Integer id;

    @Column(name = "KNOWLEDGEBASE_ID")
    private Integer knowledgebaseId;

    @Column(name = "FILE_NAME")
    private String fileName;

    // 用byte[]映射数据库的BLOB类型,Hibernate会自动处理二进制数据的转换
    @Column(name = "FILE", columnDefinition = "BLOB")
    private byte[] fileContent;

    // 无参构造函数是Hibernate的强制要求,不能省略
    public KnowledgebaseFile() {}

    // Getter和Setter方法
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getKnowledgebaseId() {
        return knowledgebaseId;
    }

    public void setKnowledgebaseId(Integer knowledgebaseId) {
        this.knowledgebaseId = knowledgebaseId;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public byte[] getFileContent() {
        return fileContent;
    }

    public void setFileContent(byte[] fileContent) {
        this.fileContent = fileContent;
    }
}

2. 编写Hibernate的插入操作代码

接下来替换原来的JDBC代码,用Hibernate的Session完成数据持久化:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;

// 假设你已经完成了SessionFactory的初始化(通常通过配置文件或容器管理)
SessionFactory sessionFactory = ...; 

try (Session session = sessionFactory.openSession()) {
    Transaction transaction = session.beginTransaction();

    // 处理上传文件的输入流,转换为byte数组
    Part file = ...; // 你的文件Part对象
    InputStream inputStream = file.getInputStream();
    // Java 9+支持readAllBytes,Java 8及以下可使用Apache Commons IO的IOUtils.toByteArray(inputStream)
    byte[] fileBytes = inputStream.readAllBytes(); 

    // 实例化实体类并赋值
    KnowledgebaseFile kbFile = new KnowledgebaseFile();
    kbFile.setId(obj.number); // obj是你业务中的原数据对象
    kbFile.setKnowledgebaseId(obj.number);
    kbFile.setFileName(Objects.requireNonNull(file.getSubmittedFileName()));
    kbFile.setFileContent(fileBytes);

    // 将实体对象保存到数据库
    session.save(kbFile);

    // 提交事务
    transaction.commit();
} catch (IOException e) {
    // 处理文件读取异常
    e.printStackTrace();
} catch (Exception e) {
    // 处理Hibernate相关异常,确保异常时事务回滚
    e.printStackTrace();
    if (session != null && session.getTransaction().isActive()) {
        session.getTransaction().rollback();
    }
}

补充注意点:

  • 如果你的项目使用Java 8,inputStream.readAllBytes()不可用,可以引入Apache Commons IO依赖,用IOUtils.toByteArray(inputStream)来完成流转byte数组的操作。
  • 确保SessionFactory是全局单例的,避免重复创建造成资源浪费。
  • 实体类的字段要和数据库表的列名、数据类型严格对应,避免映射错误。

内容的提问来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:30:16