2012-04-12 3 views
1

Hibernate JPA тип данных blob не работает с типом данных изображения Sybase. Ниже приведен образец типа данных, который я использую. Может ли кто-нибудь сказать мне, как сопоставить fileContent с типом данных изображения Sybase?Hibernate JPA + Sybase image datatype

Пример кода

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

Исключение

Вызванный: org.hibernate.HibernateException: Неправильный тип столбца в DEV_eprs.dbo.pr_file_upload для столбца file_content. Найдено: image, expected: varbinary (100000)

При использовании @Lob при получении данных получено следующее исключение.

java.lang.UnsupportedOperationException Метод com.sybase.jdbc3.jdbc.SybResultSet.getBlob (String) не поддерживается и не должен вызываться.

+0

Есть ли основания для того, чтобы использовать тип данных изображения в смене блоба, кроме поддержки старых версий? Я не знаком с sybase, но я не думаю, что типы данных изображения поддерживаются JPA. – siebz0r

+1

Sybase не поддерживает blobs. –

ответ

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; 
    } 

} 
1

Использование "текст" для LONGVARCHAR и "образ" для LONGVARBINARY см https://hibernate.atlassian.net/browse/HHH-3892

так для этого случая , вы можете использовать

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

и если вы используете Sybase ASE 15.7 (и выше), он поддерживает Lob сейчас, так

@Lob 
private byte[] fileContent