Pregunta

Tengo problemas para recuperar correctamente los datos de blobs de mi base de datos usando Java en mi aplicación JSF 2.0.El primer problema que tengo es con mi método getter para el Blob llamado "archivo". Recibo un error que dice que "Los atributos básicos sólo pueden ser de los siguientes tipos...", básicamente dice que no puedo devolver un objeto Blob.Mi código se parece al que se muestra a continuación.Incluso con el error, mi código se compila.Creé un método de prueba (el último fragmento de código a continuación) e intenté probarlo, pero me da errores de tiempo de ejecución.

frijol controlador

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

     ....

}

Método de archivo BlobDao.java para obtener 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();
    }
}

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

No estoy seguro de estar haciendo esto bien en absoluto.Cualquier ayuda sería genial.Gracias.

¿Fue útil?

Solución

en mi método getter para el Blob llamado "archivo" aparece un error que dice que "Los atributos básicos sólo pueden ser de los siguientes tipos...", básicamente dice que no puedo devolver un objeto Blob.

De hecho, un java.sql.Blob no es un campo o propiedad persistente que Hibernate/JPA pueda asignar.La especificación JPA es así:

2.1.1 Campos y propiedades persistentes

...

Los campos o propiedades persistentes de una entidad pueden ser de los siguientes tipos:tipos primitivos de Java; java.lang.String;Otros tipos serializables de Java (incluidos envoltorios de los tipos primitivos, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, tipos serializables definidos por el usuario, byte[], Byte[], char[], y Character[]);enumeraciones;tipos de entidades y/o colecciones de tipos de entidades;y clases empotrables (ver sección 2.1.5).

Probablemente deberías usar el Lob anotación y cambie su tipo de atributo.De la especificación:

9.1.19 Anotación de globo

Una anotación LOB especifica que una propiedad o campo persistente debe persistirse como un objeto grande para un tipo de objeto grande respaldado por la base de datos.Las aplicaciones portátiles deben usar la anotación LOB al asignar a un tipo de LOB de la base de datos.El LobLa anotación puede usarse junto con el Basic anotación.A Lobpuede ser un tipo binario o de carácter.El Lob El tipo se infiere del tipo del campo o propiedad persistente, y a excepción de los tipos de cadena y caracteres, los valores predeterminados a Blob.

...

Ejemplo 1:

@Lob @Basic(fetch=EAGER)
@Column(name="REPORT")
protected String report;

Ejemplo 2:

@Lob @Basic(fetch=LAZY)
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
protected byte[] pic;

Referencias

  • Especificación JPA 1.0
    • Sección 2.1.1 "Campos y propiedades persistentes"
    • Sección 9.1.19 "Anotación Lob"

Bueno, mis requisitos exactos son recuperar el Blob de la base de datos, ya sea como un Blob o un byte [], lo que funcione, y luego convertirlo de alguna manera en un objeto InputStream válido.

Qué pasa ByteArrayInputStream(byte[])?

Otros consejos

Estoy adivinando el objeto Blob es su Entidad. Podría ayudar si imprime eso también.

Asegúrese de que sus retornos Blob byte[]

@Basic(fetch = FetchType.LAZY)
@Lob             
@Column(length = 104857600, nullable = false)
private byte[] data;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top