Чтобы использовать его с Hibernate, вы должны использовать правильный тип пользователя:
public class PersistentFileAsBlob implements EnhancedUserType, Serializable {
public static final PersistentFileAsBlob INSTANCE = new PersistentFileAsBlob();
private static final int[] SQL_TYPES = new int[] { Types.BLOB };
@Override
public int[] sqlTypes() {
return SQL_TYPES;
}
@Override
public Class<?> returnedClass() {
return File.class;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
if (x == y) {
return true;
}
if (x == null || y == null) {
return false;
}
File dtx = (File) x;
File dty = (File) y;
return dtx.equals(dty);
}
@Override
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws HibernateException, SQLException {
if (owner == null) {
return null;
}
FileOutputStream fos = null;
GzipCompressorInputStream cis = null;
try {
File file = File.createTempFile(String.valueOf(owner.hashCode()),
"");
byte[] bytes = rs.getBytes(names[0]);
System.out.println(bytes.length);
fos = new FileOutputStream(file);
cis = new GzipCompressorInputStream(new BufferedInputStream(
new ByteArrayInputStream(bytes)));
int n = 0;
final byte[] buffer = new byte[1024];
while (-1 != (n = cis.read(buffer))) {
fos.write(buffer, 0, n);
}
fos.close();
return file;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (fos != null)
try {
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
if (cis != null)
try {
cis.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {
if (value == null) {
StandardBasicTypes.BINARY.nullSafeSet(st, null, index);
return;
}
File file = (File) value;
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
GzipCompressorOutputStream cos = null;
try {
fis = new FileInputStream(file);
bos = new ByteArrayOutputStream();
cos = new GzipCompressorOutputStream(new BufferedOutputStream(bos));
int n = 0;
final byte[] buffer = new byte[1024];
while (-1 != (n = fis.read(buffer))) {
cos.write(buffer, 0, n);
}
cos.close();
StandardBasicTypes.BINARY.nullSafeSet(st, bos.toByteArray(), index);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (fis != null)
try {
fis.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
if (cos != null)
try {
cos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@Override
public Object deepCopy(Object value) throws HibernateException {
return value;
}
@Override
public boolean isMutable() {
return false;
}
@Override
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable) value;
}
@Override
public Object assemble(Serializable cached, Object owner)
throws HibernateException {
return cached;
}
@Override
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
return original;
}
@Override
public String objectToSQLString(Object value) {
throw new UnsupportedOperationException();
}
@Override
public String toXMLString(Object value) {
return value.toString();
}
@Override
public Object fromXMLString(String xmlValue) {
return new File(xmlValue);
}
}
Затем вы аннотируете свой тип, ссылаясь на этот тип пользователя:
@Entity
public class Mensagem {
@Column(nullable = false)
@Type(type = "package.to.class.PersistentFileAsBlob")
private File file;
}
Как видите, я сжимаю данные перед сохранением и распаковываю перед извлечением. Взгляните на этот сайт .