2012-04-11 13 views
5

Tengo una tabla Image que contiene la información de la imagen. También quiero almacenar la imagen en sí. Así deberíaJPA: debería almacenar un BLOB en la misma tabla con fetch Lazy o debería almacenarlo en otra tabla y buscar la relación uno a uno.

1.Store el Blob en la misma mesa de la imagen y la tomase perezoso de la siguiente manera

@Basic(optional = false, fetch = FetchType.LAZY) 
@Lob 
@Column(name = "IMAGE_BLOB", length=100000) //This will generate MEDIUMBLOB 
private byte[] imageBlob; 

O

2.Crear una otra mesa ImageBlob con OneToOne relación con Image, y buscar perezoso la relación

@OneToOne(cascade = CascadeType.ALL, mappedBy = "image", fetch=FetchType.LAZY) 
private ImageBlob imageBlob; 

Son estos tw o técnica lo mismo en términos de rendimiento?

+0

Realice la primera implementación. No afectará si va a buscar perezosamente. Puede escribir otro método donde lo devuelva basándose en el ID único de fila si se debe devolver BLOB. – Phani

+0

@Phani: Gracias. –

+0

Por favor, aceptar o cerrar la pregunta. – Phani

Respuesta

3

Ambos deberían dar como resultado el mismo rendimiento, pero recomendaría el segundo para blobs grandes.

Las bases de datos pueden ser complicadas con blobs, y es mejor tenerlas aisladas para su propio objeto. Esto le dará más control sobre el blob.

+0

Muchas gracias por su visión –

3

Hasta donde yo sé, el primero no funciona con Hibernate y EclipseLink como proveedores de JPA. LAZY es una pista para el proveedor, estos se cargarán ansiosamente sin informar un error o advertencia.

La asociación de OneToOne será floja solo si el entrelazado de clases está habilitado, de lo contrario tampoco será de ayuda.

Lo he hecho usando una tabla completamente separada llamada LazyBlob, con los atributos "entidad" y "id", y escribí una clase de utilidad para obtener lob de forma perezosa de esta tabla.

+0

LAZY en un básico funciona con EclipseLink (usando tejido). Pero una tabla separada es normalmente mejor para grandes LOB. – James

+0

@James LAZY hace * tipo de trabajo * con Eclipselink weaving. Al menos con Eclipselink 2.3.1, funcionará para consultas simples, pero si se une a buscar a otra tabla, el LOB se buscará ansiosamente. He tenido que evitar esta limitación en algunas aplicaciones. – gpeche

+0

Es por eso que utilicé el enfoque en respuesta. Mientras que LAZY sea una pista, nunca se sabe cuándo dejará de funcionar. Eso no es un problema, si el archivo es pequeño, pero lo es, si es grande y solo en una pequeña fracción de casos necesarios. – Oliv

Cuestiones relacionadas