【问题标题】:Unable to persist java.sql.BLOB into oracle BLOB using JPA无法使用 JPA 将 java.sql.BLOB 持久化到 oracle BLOB
【发布时间】:2012-12-14 01:29:15
【问题描述】:

我正在尝试使用 JPA(2.0) 将图像作为 blob 保存在 oracle 数据库(11g) 中

下面是我的实体类

@Entity
@Table(name="MyTable")
public class MyEntity implements Serializable {

@Column(name="IMAGE_BLOB")
private  Blob imageBlob;

public void setImageBlob(Blob imageBlob) {
this.imageBlob = imageBlob;
}

public Blob getImageBlob() {
return imageBlob;
}

}

下面是我尝试设置 blob 的代码

InputSteram fis = new FileInputStream("C://folder1/folder2/image1.jpg");
byte[] imageByteArray= IOUtils.toByteArray(fis);

Blob imageBlob = new SerialBlob(imageByteArray);

MyEntity myEntity = new MyEntity();
myEntity.setImageBlob(imageBlob ).

当我运行上述代码 sn-p 并将 MyEntity 持久保存到数据库中时,我看到所有值都正确保存在数据库中,除了显示为 null 的 IMAGE_BLOB 列值,它会抛出任何异常。我还验证了要设置的 imageBlob 不为空。

谁能帮我解决这个问题。

【问题讨论】:

  • 您使用 Blob 对象而不是字节数组有什么特别的原因吗?
  • 是的,我在字节数组方面遇到了几个问题,一个 - 我得到类转换异常,oracle.sql.BLOB 与 oracle.sql.BLOB 不兼容 2) 我遇到了元模型类奇异属性的问题在 JPA 中。所以我被告知使用 java.sql.Blob 而不是字节数组。
  • 之后您如何查询以检查 BLOB?我假设您正在验证长度 > 0?
  • 是的,我还检查了 blob 的长度,在我的例子中是 4930。
  • 如何使用 JDBC Blob 而不是供应商特定的 Blob?每次我看到 Oracle 和 BLOB 出现问题时,解决方案都是停止尝试使用供应商特定的东西并使用 JDBC 正确地完成它。你在用java.sql.Blob吗?

标签: java jpa oracle11g blob openjpa


【解决方案1】:
@LOB  
@Column(name="IMAGE_BLOB")  
private  byte[] imageBlob;

它运行良好,我也在 Oracle DB 中完成了它。所以如果你得到ClassCastException,那么你的Java代码就会有问题。

【讨论】:

  • 我不明白是什么导致了这个类转换异常,因为我在实体类中使用了你上面提到的字节数组,我读到当有多个版本的 ojdbc jar 时我们会遇到这个问题。但我只有一个 jar,即 ojdbc6.jar。任何帮助将不胜感激..
  • 我使用 openJPA 作为持久性提供者
  • 我还启用了jpa日志跟踪以检查是否正在插入blob,但是插入语句没有Blob列(例如COLUMN4)堆栈跟踪:openjpa.jdbc.SQL:跟踪: 执行 prepstmnt 488316187 INSERT INTO SCHEMA_WEB.TABLE (COLUMN1, COLUMN2, COL3) VALUES (?, ?, ?) [params=?, ?, ?]
猜你喜欢
  • 2013-09-02
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2010-10-04
相关资源
最近更新 更多