2010-09-07 33 views
9

Tengo un esquema de base de datos existente que intento ORM'ise con anotaciones JPA/Hibernate. El esquema está diseñado para permitir a los clientes asociar información adicional con cada fila en una tabla. En lugar de utilizar un patrón de clave-valor , la solución existente determina el número requerido de columnas dinámicas en el momento de la instalación y altera la tabla a para agregar columnas adicionales para los campos dinámicos. En efecto, cada tabla tiene un conjunto de columnas conocidas y fijas y un grupo de columnas dinámicas.Columnas dinámicas de asignación de JPA/Hibernate como una lista de objetos

|table:X| 
|id|known1|known2|dynamic1|dynamic2|..|dynamicx| 

una tabla de parámetros indica qué tablas tienen campos adicionales dinámicos

|table:parameter| 
|table|column|meta| 
|x|dynamic1|| 
|x|dynamic2|| 
|x|dynamicx|| 
|y|dynamic15|| 

En JPA modelado esto, es fácil crear una definición para las columnas fijas conocidas en cada mesa.

@Entity 
@Table(name="x") 
public class X 
{ 
    @Id 
    private Long id = null; 

    @Column(name="known1") 
    private Long known1 = null; 
} 

planeo para modelar la tabla de parámetros como clase, y luego permitir que cada una de mis clases para tener una lista de parámetros. No estoy seguro de cómo debería hacer para mapear este objeto List para que los detalles se escriban en la misma tabla.

@Entity 
@Table(name="x") 
public class X 
{ 
    // @Column(name="x",class="X") ?????????? 
    List<Parameter> dynamicColumns = null; 
} 

Creo que puedo utilizar una estrategia de nomenclatura personalizada para determinar correctamente el nombre de columna para el campo dinámico. ¿Es este tipo de mapeo posible?

+1

espero que son capaces de cambiar la base de datos ... esto suena como un esquema que necesita un poco de normalización. – Zoidberg

+0

para esta pregunta supongamos que no puedo. Creo que estoy cerca de golpear la pared de ladrillos. – emeraldjava

Respuesta

1

Creo que necesitará usar una query nativa para obtener esta información dinámica usando jpa.

+0

+1: Creo que JPA no fue diseñado para este tipo de necesidad, y si logras hacerlo, será a un gran costo (y hacks sucios). Simplemente use consultas nativas y 'ResultTransformer's siempre que sea posible, eso es todo lo que Hibernate puede proporcionar aquí. – Vincent

+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. – Chaos

+0

@Chaos Esto no pretende ser una crítica, en mi humilde opinión esta es la mejor manera de resolver este problema, es decir, consultar una lista de columnas dinámicas de una tabla. – AmanicA

0

En Hibernate esto es posible, consulte el artículo a continuación. Sin embargo, ese es un enfoque antiguo (2007) yo mismo estoy rompiendo la cabeza para implementarlo usando JPA. no tenido éxito hasta ahora

http://www.infoq.com/articles/hibernate-custom-fields

Otro hilo de correo electrónico en este tema es

https://www.java.net//node/666078

+1

Se desaconsejan las respuestas de solo enlace debido a la desaparición de los enlaces. –

Cuestiones relacionadas