1

Hibernate JPAデータ型blobは、Sybaseイメージデータ型では機能しません。以下は、私が使用しているデータ型のサンプルです。fileContentをSybaseイメージデータ型にマップする方法を教えてもらえますか?

サンプルコード

@Column(length=100000)
private byte[] fileContent;

例外

原因:org.hibernate.HibernateException:列file_contentのDEV_eprs.dbo.pr_file_uploadの列タイプが間違っています。見つかった:画像、期待された:varbinary(100000)

@Lobを使用すると、データを取得するときに次の例外が発生しました。

java.lang.UnsupportedOperationExceptionメソッドcom.sybase.jdbc3.jdbc.SybResultSet.getBlob(String)はサポートされていないため、呼び出す必要はありません。

4

2 に答える 2

1

カスタムデータ型を作成することでこの問題を解決しました。以下が解決策です。これが他の人に役立つことを願っています。

//あなたのエンティティ

@Type(type = "org.company.project.entities.types.BlobType")
private byte[] fileContent;

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

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

//カスタムデータ型

public class BlobType implements UserType {

  public int[] sqlTypes() {
      return new int[] { Types.BLOB };
  }

  public Class returnedClass() {
      return Blob.class;
  }

  public Object nullSafeGet(ResultSet aResultSet, String[] aColName, Object aObject)
          throws HibernateException, SQLException {
      return getBlobFromBinaryStream(aResultSet, aColName[0]);
  }

  private byte[] getBlobFromBinaryStream(ResultSet aResultSet, String aColName)
          throws SQLException {

      byte[] theBuff = new byte[2 * 1024];
      InputStream theInStream = aResultSet.getBinaryStream(aColName);

      ByteArrayOutputStream theBaos = new ByteArrayOutputStream();
      int n = 0;
      try {
          if (theInStream != null)
          {
              while (-1 != (n = theInStream.read(theBuff))) {
                  theBaos.write(theBuff, 0, n);
              }
          }
          theBaos.flush();
      } catch (IOException e) {
          e.printStackTrace();
      }

      return theBaos.toByteArray();
  }

  public void nullSafeSet(PreparedStatement aStmt, Object aValue, int aIndex)
          throws HibernateException, SQLException {
      aStmt.setBytes(aIndex, (byte[]) aValue);
  }

  public boolean equals(Object x, Object y) {
      if ((x == y) ||
              (x != null && y != null && Arrays.equals(
                      ((byte[]) x),
                      ((byte[]) y)))) {
          return true;
      }
      return false;
  }

  public int hashCode(Object aArg) throws HibernateException {
      return aArg.hashCode();
  }

  public boolean isMutable() {
      return false;
  }

  public Object assemble(Serializable aSerializableObject, Object aObject) throws HibernateException {
      return null;
  }

  public Serializable disassemble(Object aObject) throws HibernateException {
      return null;
  }

  public Object replace(Object aObject1, Object aObject2, Object aObject3) throws HibernateException {
      return null;
  }

  public Object deepCopy(Object aValue) {
      return aValue;
  }

}
于 2012-06-05T18:34:24.330 に答える
1

LONGVARCHARに「text」を使用し、LONGVARBINARYに「image」を使用する場合は、https: //hibernate.atlassian.net/browse/HHH-3892を参照してください。

したがって、この場合は、

@Type(type = "image")
private byte[] fileContent; 

また、Sybase ASE 15.7(およびそれ以降)を使用している場合は、Lobをサポートするようになりました。

@Lob
private byte[] fileContent
于 2013-07-10T19:15:49.380 に答える