2012-01-28 11 views
8

he encontrado muy buena solución de recuperación de imágenes de db/blob gracias a How to retrieve and display images from a database in a JSP page?recuperar la imagen de la burbuja a través de Hibernate (no JDBC)

Pero esta es la solución que utiliza conexión JDBC en cada solicitud de imagen .

estoy usando muelle 3 anotaciones y Hibernate 3.

he intentado hacer algo similar por mi 'imageService', que se autowired por anotación en clase ImageServlet, pero tengo nullPointerException, lo que significa que puede imageService no está definida por la inyección de dependencias.

¿Hay alguna manera de solucionar eso? No me gusta hacer una sola conexión jdbc en la solicitud de imagen.

+0

¿Puede mostrar algún código (clases ImageService e ImageServlet)? puede olvidarse de agregar la anotación '@ Component' o' @ Service' en su clase imageService. –

+0

hibernate confía 100% en JDBC –

Respuesta

6

Espero que esté almacenando la imagen en la tabla como un tipo BLOB (si no lo hace, ya que esta es la mejor práctica). Supongamos que tiene una clase Person con el image de la persona almacenada en la base de datos. Si desea asignar esto, simplemente agregue una propiedad en su persona POJO que contiene la imagen.

@Column(name="image") 
@Blob 
private Blob image; 

Cuando se muestra que, convertirlo en un byte[] y espectáculo.

private byte[] toByteArray(Blob fromImageBlob) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     return toByteArrayImpl(fromImageBlob, baos); 
    } catch (Exception e) { 
    } 
    return null; 
    } 



private byte[] toByteArrayImpl(Blob fromImageBlob, 
     ByteArrayOutputStream baos) throws SQLException, IOException { 
    byte buf[] = new byte[4000]; 
    int dataSize; 
    InputStream is = fromImageBlob.getBinaryStream(); 

    try { 
     while((dataSize = is.read(buf)) != -1) { 
     baos.write(buf, 0, dataSize); 
     }  
    } finally { 
     if(is != null) { 
     is.close(); 
     } 
    } 
    return baos.toByteArray(); 
    } 

Puedes ver los ejemplos a continuación para saber más sobre él.

  1. http://i-proving.com/2006/08/23/blobs-and-hibernate
  2. http://snehaprashant.blogspot.com/2008/08/how-to-store-and-retrieve-blob-object.html
  3. http://viralpatel.net/blogs/2011/01/tutorial-save-get-blob-object-spring-3-mvc-hibernate.html

Como se puede ver hay varias maneras de hacer esto. Elija el apropiado para usted.

+0

Todavía estoy confundido a pesar de esta buena explicación. Blob es una interfaz, entonces, ¿cómo lo está usando como un tipo de datos? Estoy usando hibernate JPA y no puedo encontrar la forma de mapear esto correctamente. Ver publicación aquí http://stackoverflow.com/questions/10141373/read-and-write-blobs-by-mapping-them-to-binary-data –

+0

@George: como usuarios de API no deberíamos preocuparnos si BLOB es una interfaz o clase Hibernate tendrá algo [clase] (http://stackoverflow.com/a/9312802/507864) implementando el tipo BLOB y lo usará para completar los datos. Si sigue los ejemplos correctamente, debería poder asignar un tipo BLOB correctamente. Mientras tanto, puedes votar la respuesta si es útil. – ManuPK

+0

Estoy confundido, el uso de una anotación @Blob que no es una anotación de hibernación válida. Está resultando con un error de compilación. Cuando uso java.sql.Blob como un tipo de datos, obtengo otro error de compilación con netbeans. los atributos básicos solo pueden ser de los siguientes tipos: ..... También estoy usando entidades y no archivos de mapeo de hibernación, así que no estoy seguro de cómo asignar mi tipo de datos de atributos al tipo de datos blob. Algunos enlaces que vinculan a Hibernate también se rompen. –

Cuestiones relacionadas