尝试使用hibernate JPA从Sybase DB读取blob时出现以下异常。
实体
@Lob
@Column(length=100000)
private byte[] fileContent;
public byte[] getFileContent() {
return fileContent;
}
public void setFileContent(byte[] fileContent) {
this.fileContent = fileContent;
}
ioc.Registry不支持com.sybase.jdbc3.jdbc.SybResultSet.getBlob(String)方法,不应该调用它。 ioc.Registry操作跟踪: ioc.Registry [1]在Purchase_Request上触发事件'activate' TapestryModule.RequestExceptionHandler请求处理因未捕获异常而失败:不支持com.sybase.jdbc3.jdbc.SybResultSet.getBlob(String)方法,不应调用该方法。 org.apache.tapestry5.ioc.internal.OperationException:不支持com.sybase.jdbc3.jdbc.SybResultSet.getBlob(String)方法,不应该调用它。
我遇到了以下hibernate线程,该线程提供了一个链接到如何通过将blob映射到二进制数据来读取和写入blob的示例的链接,但链接已经死了。
主题 https://forum.hibernate.org/viewtopic.php?f=1&t=936553
死链接 http://www.hibernate.org/73.html
我想知道是否有人可以提供一个例子或文章来描述如何做到这一点?
更新
我发现以下JIRA问题概述了这个问题 https://issues.jboss.org/browse/JBPAPP-2867
Laura声称“此问题的解决方法是创建映射到Sybase文本和图像类型的用户定义类型。”
是否有人熟悉创建用户定义的类型?
答案 0 :(得分:0)
您可以尝试在映射中使用java.sql.Blob而不是字节数组。您可以使用Hibernate.createBlob()函数从字节数组,字符串,输入流转换blob。这样做的好处是延迟加载(只有在休眠会话打开之前)。
否则..内存加载较大的对象会占用大量的堆空间。
private void setBlob(Blob blob)
{
this.image = toByteArray(blob);
}
private Blob getBlob()
{
return Hibernate.createBlob(this.image);
}