Получение Blob из базы данных MySQL в приложении Hibernate / JSF - PullRequest
3 голосов
/ 25 октября 2010

У меня возникли проблемы с правильным получением данных BLOB-объектов из моей базы данных с использованием Java в моем приложении JSF 2.0. Первая проблема, с которой я столкнулся, - это метод получения для BLOB-объекта с именем «file». Я получаю сообщение об ошибке, в котором говорится, что «Базовые атрибуты могут быть только следующих типов ...», говоря, что я не могу вернуть объект Blob. Мой код выглядит так, как показано ниже. Даже с ошибкой мой код компилируется. Я создал тестовый метод (последний бит кода ниже) и попытался проверить, но он дает мне ошибки во время выполнения.

Контроллер Бин

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

     ....

}

BlobDao.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");
    }
}

Я не уверен, что я все делаю правильно. Любая помощь будет отличной. Благодаря.

Ответы [ 2 ]

1 голос
/ 25 октября 2010

в моем методе получения для BLOB-объекта с именем «file» я получаю сообщение об ошибке, говорящее, что «Базовые атрибуты могут быть только следующих типов ...», в основном говоря, что я не могу вернуть объект 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[]);перечисления;типы сущностей и / или коллекции типов сущностей;и встраиваемые классы (см. раздел 2.1.5).

Вы, вероятно, должны использовать аннотацию Lob и изменить свой тип атрибута.Из спецификации:

9.1.19 Аннотация Lob

Аннотация Lob указывает, что постоянное свойство или поле должно сохраняться как большой объект для большого типа, поддерживаемого базой данных.Переносимые приложения должны использовать аннотацию 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, либо в виде байта [], в зависимости от того, что работает, а затем каким-то образом преобразовать это в действительный объект InputStream.*?

0 голосов
/ 25 октября 2010

Я предполагаю, что Blob объект - это ваша сущность. Это может помочь, если вы распечатаете это.

Убедитесь, что ваш Blob возвращает byte[]

@Basic(fetch = FetchType.LAZY)
@Lob             
@Column(length = 104857600, nullable = false)
private byte[] data;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...