Java 通过Hibernate(不是JDBC)从blob检索图像

Java 通过Hibernate(不是JDBC)从blob检索图像,java,spring,hibernate,blob,Java,Spring,Hibernate,Blob,我找到了从db/blob检索图像的非常好的解决方案,这要感谢 但这是一个在每个映像请求上都使用JDBC连接的解决方案 我正在使用Spring3注释和Hibernate3 我试图通过我的“imageService”做类似的事情,它是通过ImageServlet类中的注释自动连接的,但我得到了nullPointerException,这意味着可能imageService不是通过依赖项注入设置的 有没有办法解决这个问题?我不喜欢在映像请求时建立单个jdbc连接。我希望您将映像作为BLOB类型存储在表中

我找到了从db/blob检索图像的非常好的解决方案,这要感谢

但这是一个在每个映像请求上都使用JDBC连接的解决方案

我正在使用Spring3注释和Hibernate3

我试图通过我的“imageService”做类似的事情,它是通过ImageServlet类中的注释自动连接的,但我得到了nullPointerException,这意味着可能imageService不是通过依赖项注入设置的


有没有办法解决这个问题?我不喜欢在映像请求时建立单个jdbc连接。

我希望您将映像作为BLOB类型存储在表中(如果没有,请尝试这样做,因为这是最佳做法)。让我们假设您有一个
Person
类,该类具有存储在数据库中的人的
图像。如果您想映射这个,只需在person POJO中添加一个保存图像的属性

@Column(name="image")
@Blob
private Blob image;
显示时,将其转换为
字节[]
并显示

private byte[] toByteArray(Blob fromImageBlob) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
      return toByteArrayImpl(fromImageBlob, baos);
    } catch (Exception e) {
    }
    return null;
  }



private byte[] toByteArrayImpl(Blob fromImageBlob, 
      ByteArrayOutputStream baos) throws SQLException, IOException {
    byte buf[] = new byte[4000];
    int dataSize;
    InputStream is = fromImageBlob.getBinaryStream(); 

    try {
      while((dataSize = is.read(buf)) != -1) {
        baos.write(buf, 0, dataSize);
      }    
    } finally {
      if(is != null) {
        is.close();
      }
    }
    return baos.toByteArray();
  }
您可以通过以下示例了解更多信息


  • 正如您所看到的,有多种方法可以做到这一点。选择一个适合您的。

    您能展示一些代码(ImageService和ImageServlet类)吗?您可能会忘记在imageService类中添加
    @组件
    @Service
    注释。hibernate 100%依赖JDBCI,尽管有这么好的解释,但我仍然感到困惑。Blob是一个接口,那么如何将其用作数据类型?我使用的是HibernateJPA,不知道如何正确地映射它。请看这里的帖子@George:作为API的用户,我们不应该担心BLOB是否是一个接口或类。Hibernate将有一些实现BLOB类型的工具,他们将使用它来填充数据。如果您正确地遵循这些示例,您应该能够正确地映射BLOB类型。同时,如果答案有用的话,你可以投票表决。我很困惑,你使用的@Blob注释不是有效的hibernate注释。它导致了一个编译错误。当使用java.sql.Blob作为数据类型时,我又遇到了另一个netbeans编译错误。基本属性只能是以下类型:……我还使用实体而不是hibernate映射文件,因此我不确定如何将属性数据类型映射到blob数据类型。一些链接回hibernate的链接也被破坏了。@George:你可能会发现这很有用,我想他指的是
    @Lob
    而不是
    @Blob