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