2009-11-03 38 views
25

Digamos que tengo una tabla con 200 columnas y la mayoría de ellas nunca se utilizan.2 entidades JPA en la misma tabla

Asignar SmallEntity a las 10 columnas que se utilizan con frecuencia. Lo uso en las asociaciones con otras entidades. Se carga rápido, consume poca memoria y me hace feliz.

Pero a veces necesito mostrar las 200 columnas. Me gustaría asignar la clase BigEntity en las 200 columnas. No está vinculado a ninguna otra entidad, no tiene asociación.

Pregunta: ¿Tienes alguna experiencia haciendo eso? ¿Conoce algún problema que pueda tener Hibernate, como por ejemplo en el caché de primer nivel, la comprobación sucia y el ciclo de vida de la entidad en general?

+1

Buena pregunta. La migración al nuevo marco puede ser otra razón para tal pregunta. P.ej. puede haber un sistema heredado y un nuevo sistema, y ​​ambos deberían funcionar contra la misma base de datos. – TomR

Respuesta

17

La forma más sencilla de hacer esto es mapear las propiedades no se utiliza a menudo como lazy:

<property name="extendedProperty" lazy="true" /> 

... or using Annotations ... 

@Basic(fetch = FetchType.LAZY) 
String getExtendedProperty() { ... } 

Hibernate no cargaría tales propiedades inicialmente; en su lugar, se cargarán bajo demanda (cuando se acceda por primera vez). Puede forzar a Hibernate a cargar todas las propiedades usando la cláusula fetch all properties en su consulta HQL.

Otro posible escenario es mapear dos entidades completamente separadas a la misma tabla pero hacer una de ellas immutable. Tenga en cuenta que será tratado por Hibernate como entidades diferentes, con la memoria caché de primer/segundo nivel completamente separada para ambos (razón por la cual la inmutabilidad es importante).

Usted NO ser capaz de conseguir esta funcionalidad a través de la cartografía herencia porque Hibernate siempre devuelve un tipo real entidad concreta. Eche un vistazo a mi respuesta a la pregunta Hibernate Inheritance Strategy para una explicación detallada.

+0

¡Muchas gracias por esta gran respuesta! –

+0

Parece que la recuperación lenta de propiedades requiere instrumentación de bytecode. ¿Es eso tan común en los proyectos? Esto es de la guía de anotaciones de Hibernate: Para habilitar la recuperación diferida del nivel de propiedad, sus clases deben estar instrumentadas: el bytecode se agrega al original para habilitar dicha función, consulte la documentación de referencia de Hibernate. Si sus clases no están instrumentadas, la carga diferida del nivel de propiedad se ignora silenciosamente.

+0

Sí, la construcción de bytecode es necesaria para las propiedades perezosas, pero es fácil de agregar durante la compilación (http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html#performance-fetching-lazyproperties) No es muy común (en mi experiencia) porque el caso de uso de propiedades perezosas (a diferencia de las asociaciones perezosas) no es tan común, pero tampoco es demasiado raro. Sin duda se ha hecho antes y está listo para la producción si esa es su preocupación. – ChssPly76

Cuestiones relacionadas