2009-10-02 36 views
6

Estoy trabajando en una aplicación web. Estamos utilizando Hibernate como ORM en nuestro proyecto. En realidad, nuestra aplicación crea algunas tablas de forma dinámica en función de la selección del usuario. El usuario puede seleccionar el nombre de la tabla, el nombre de la columna y luego puede importar datos desde un archivo csv. Entonces mi pregunta es: ¿cómo mapear esta tabla creada dinámicamente con objetos de Hibernate y Java?Cómo mapear tabla creada dinámicamente en Hibernate?

Respuesta

10

Se puede hacer de forma dinámica, pero es un poco desordenado:

Tendrá que modificar dinámicamente objeto de configuración de Hibernate antes de que se construyó SessionFactory. Si está utilizando Spring, puede hacerlo anulando el método postProcessAnnotationConfiguration() de AnnotationSessionFactoryBean; de lo contrario, solo tendrá que hacerlo utilizando su objeto de Configuración antes de invocar buildSessionFactory() en él.

Si necesita hacer esto sin reiniciar la aplicación, está buscando ya sea reconstruir su SessionFactory (lo que significa que sus usuarios tendrán que esperar hasta que se haga) o usar una instancia separada de SessionFactory específicamente dedicada a sus clases personalizadas (que es casi imposible si sus clases personalizadas necesitan referenciar sus clases integradas).

Puede obtener acceso a asignaciones de clase/tabla a través del configuration.getMappings(). A continuación, deberá crear una nueva asignación de tabla a través del Table API y agregarla a la configuración a través del addTable(). Lo mismo tendrá que hacerse con PersistentClass que representa un mapeo de clase. Si está utilizando la misma clase para representar varias entidades (por ejemplo, mapear múltiples tablas), asegúrese de usar nombres de entidades únicos para cada una. Tendrás que hacer esto (modificar la configuración) en cada reinicio de la aplicación.

2

¿Cuántas de las tablas se crean dinámicamente? ¿Las tablas son similares y solo cambias el nombre de la base de datos?

Aquí es una discusión de cambiar el nombre de la tabla: http://www.experts-exchange.com/Programming/Languages/Java/J2EE/Frameworks/Spring/Q_24237099.html

Si usted está construyendo una nueva tabla por completo, se puede utilizar una vista, y la gente simplemente directos a una vista?

¿Por qué está utilizando Hibernate para esto, en lugar de solo crear dinámicamente consultas en JDBC?

+0

Estoy de acuerdo, el uso de Hibernate para este problema no es correcto. – sbidwai

0

La solución de base de datos: puede crear una vista y señalarla a una tabla u otra (suponiendo que la estructura sea idéntica).

CREATE VIEW HIBERNATE_NAME como SELECT * FROM TABLE_A

o CREATE VIEW HIBERNATE_NAME como SELECT * FROM TABLE_B

Sería necesario que la aplicación para ejecutar SQL nativo (DDL), sin embargo esto debería ser más fácil que Hibernate hacks

Cuestiones relacionadas