Получение BLOB из базы данных MySQL в приложении Hibernate / JSF

StackOverflow https://stackoverflow.com/questions/4013783

  •  26-09-2019
  •  | 
  •  

Вопрос

У меня есть некоторые проблемы правильно извлеките данные 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top