2009-10-02 8 views
6

Je travaille sur une application web. Nous utilisons Hibernate comme ORM dans notre projet. En fait, notre application crée des tables dynamiquement en fonction de la sélection de l'utilisateur. L'utilisateur peut sélectionner le nom de la table, le nom de la colonne, puis il peut importer les données d'un fichier csv. Donc ma question est: comment mapper cette table créée dynamiquement avec des objets Hibernate et Java?Comment mapper une table créée dynamiquement dans Hibernate?

Répondre

10

Il peut être fait de façon dynamique, mais il est un peu en désordre:

Vous aurez besoin de modifier dynamiquement l'objet de configuration de mise en veille prolongée avant SessionFactory est construit. Si vous utilisez Spring, cela peut être fait en remplaçant la méthode postProcessAnnotationConfiguration() de AnnotationSessionFactoryBean; Sinon, vous devrez juste le faire en utilisant votre objet Configuration avant d'appeler buildSessionFactory() dessus. Si vous avez besoin de le faire sans redémarrer l'application, vous devez soit reconstruire votre SessionFactory (ce qui signifie que vos utilisateurs devront attendre jusqu'à ce que cela soit fait), soit utiliser une instance SessionFactory spécifique spécifiquement dédiée à vos classes personnalisées (est presque impossible si vos classes personnalisées doivent référencer vos classes intégrées).

Vous pouvez accéder aux mappages de classe/table via configuration.getMappings(). Vous devrez ensuite créer un nouveau mappage de table via Table API et l'ajouter à la configuration via addTable(). La même chose devra être faite avec PersistentClass qui représente un mappage de classe. Si vous utilisez la même classe pour représenter plusieurs entités (par exemple, pour mapper plusieurs tables), veillez à utiliser des noms d'entité uniques pour chacun d'eux. Vous devrez le faire (modifier la configuration) à chaque redémarrage de l'application.

2

Quelle proportion des tables sont créées dynamiquement? Les tableaux sont-ils similaires et vous changez simplement le nom de la base de données?

Voici une discussion de changer le nom de la table: http://www.experts-exchange.com/Programming/Languages/Java/J2EE/Frameworks/Spring/Q_24237099.html

Si vous construisez complètement une nouvelle table, vous pouvez utiliser une vue, et juste de diriger les gens à vue? Pourquoi utilisez-vous Hibernate pour cela, plutôt que de simplement créer dynamiquement des requêtes dans JDBC?

+0

Je suis d'accord, en utilisant Hibernate pour ce problème n'est pas correct. – sbidwai

0

La solution de base de données - vous pouvez créer une vue et la diriger vers une table ou une autre (en supposant que la structure est identique).

CREATE VIEW HIBERNATE_NAME que SELECT * FROM TABLE_A

ou Créer une vue HIBERNATE_NAME comme SELECT * FROM TABLE_B

Vous devez vous demande d'exécuter SQL (DDL) natif, mais ce devrait être plus facile que Hibernate hacks

Questions connexes