Получение BLOB из базы данных MySQL в приложении Hibernate / JSF
Вопрос
У меня есть некоторые проблемы правильно извлеките данные BLOB из моей базы данных с помощью Java в моем приложении JSF 2.0. Первая проблема, которую я имею в моем методе Getter для Blob Named «Файл», я получаю сообщение о том, что «базовые атрибуты могут быть только из следующих типов ...» в основном говоря, что я не могу вернуть объект BLOB. Мой код выглядит как то, что ниже. Даже с ошибкой мой код компилирует. Я создал метод испытаний (последний бит код ниже) и пытался проверить, но это дает мне ошибки времени выполнения.
Контроллер Bean
import java.sql.Blob;
@Entity
@Table(named = "files")
@NamedQueries( {
@NamedQuery(name = "MyBlob.getBlob",
query = from MyBlob WHERE fileId =: fileId")
})
public class MyBlob implements Serializable {
private Integer fileId;
private Blob file;
...
public Integer getFileId() {
return fileId;
}
public void setFileId() {
this.fileId = fileId;
}
public Blob getFile() {
return file;
}
public void setFile(Blob file) {
this.file = file;
}
....
}
Flobdao.java Файл метод, чтобы получить BLOB
public MyBlob getBlob(Integer fileId) throws HibernateException {
Session session = getSessionFactory().openSession();
try {
MyBlob blob = (MyBlob)session.getNamedQuery("MyBlob.getBlob").setInteger("fileId", fileId).uniqueResult();
return blob;
} catch(HibernateException e) {
throw new HibernateException(e);
} finally {
session.close();
}
}
Testdao.java.
@Test
public void testBlob() {
MyBlob test = blobdao.getBlob(1); // 1 is a fileId that exists in the DB with a blob image file.
Blob blob = test.getFile();
try {
System.out.println(blob.length)); //this prints a number but I dont think the right one.
if(blob.length > 0 ) {
System.out.println(blob.toString() ); //errors out here
}
} catch(SQLException e) {
return System.out.println("Failed");
}
}
Я не уверен, что я делаю это вообще. Любая помощь была бы здоровой. Спасибо.
Решение
В моем методе Getter для BLOB имени «Файл», я получаю сообщение о том, что «базовые атрибуты могут быть только из следующих типов ...» в основном говоря, что я не могу вернуть объект BLOB.
Действительно, А. java.sql.Blob
не является постоянным месторождением или имуществом, которое можно сопоставлять с помощью Hibernate / JPA. Спецификация JPA ставит так:
2.1.1 Стойкие поля и свойства
...
Постоянные поля или свойства субъекта могут иметь следующие типы: примитивные типы Java;
java.lang.String
; Другие java сериализуемые типы (включая обертки примитивных типов,java.math.BigInteger
,java.math.BigDecimal
,java.util.Date
,java.util.Calendar
,java.sql.Date
,java.sql.Time
,java.sql.Timestamp
, определенные пользователем сериализуемые типы,byte[]
,Byte[]
,char[]
, а такжеCharacter[]
); enums; Типы объектов и / или коллекции типов объектов; и вложенные классы (см. Раздел 2.1.5).
Вы, вероятно, должны использовать Lob
Аннотация и изменить тип вашего атрибута. Из спецификации:
9.1.19 LOB Annotation
Annotation LOB указывает, что постоянное свойство или поле должны быть сохранены в качестве большого объекта для поддержанного базы данных большого типа объекта. Портативные приложения должны использовать аннотацию LOB при сопоставлении на тип базы данных. То
Lob
Аннотация может использоваться в сочетании сBasic
Аннотация. А.Lob
Может быть либо двоичным или символьным типом. ТоLob
Тип выводится из типов постоянного поля или свойства, и за исключением строки и типов на основе символов по умолчанию для BLOB....
Пример 1:
@Lob @Basic(fetch=EAGER) @Column(name="REPORT") protected String report;
Пример 2:
@Lob @Basic(fetch=LAZY) @Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL") protected byte[] pic;
использованная литература
- Спецификация JPA 1.0
- Раздел 2.1.1 «Стойкие поля и свойства»
- Раздел 9.1.19 "ЛОБ Аннотация"
Ну, мои точные требования состоят в том, чтобы получить BLOB из базы данных в виде BLOB или байта [], что бы ни работает, а затем как-то преобразует это в действительный объект ввода.
Что о ByteArrayInputStream(byte[])
?
Другие советы
Я предполагаю, что Blob
Объект - ваша организация. Это может помочь, если вы печатаете это тоже.
Убедитесь, что вы Blob
возвращается byte[]
@Basic(fetch = FetchType.LAZY)
@Lob
@Column(length = 104857600, nullable = false)
private byte[] data;