2009-11-17 5 views
3

Dans mon projet, je dois basculer entre les bases de données pendant l'exécution. J'ai essayé d'utiliser Hibernate, mais coincé dans un endroit, où j'ai besoin de mapper un objet avec une table dans la base de données. Le problème est, que j'ai plusieurs tables avec le préfixe: documents2001, documents2002 ... Comme je l'ai compris, je ne peux pas mapper la classe avec la table pendant l'exécution. J'ai essayé d'utiliser iBatis, mais le problème est dans la modification de la base de données pendant l'exécution. Dans iBatis, c'est assez difficile à faire. \Hibernate ou iBatis ou autre chose?

Peut-être quelques conseils, que devrais-je utiliser?

Mes besoins:

  • Possibilité de se connecter à différentes bases de données lors de l'exécution
  • Possibilité de changer la table lors de l'exécution (si la classe est mis en correspondance avec table, comme il est en veille prolongée).

MISE À JOUR: Ok, essayez d'expliquer I `ll:
Je dois écrire des applications qui peuvent se connecter à différentes bases de données lors de l'exécution. L'utilisateur de l'application peut choisir, quelle base de données se connecter. Toutes les bases de données ont la même structure. En plus de cela, l'utilisateur peut basculer entre les tables dans la base de données. Les tables ont la même structure.

  • Pourquoi je suppose, je ne peux pas utiliser Hibernate: Dans la classe Hibernate est mis en correspondance avec une table, donc je ne peux pas changer la table lors de l'exécution. Cela ne me permet pas de choisir la table, à laquelle je peux me connecter.
  • Pourquoi je suppose, je ne peux pas utiliser iBATIS. Dans iBATIS, il est très difficile de se connecter à une base de données différente pendant l'exécution. Ainsi, l'utilisateur ne pourra pas se connecter à une base de données différente pendant l'exécution.

Peut-être qu'il y a un autre outil que je peux utiliser?

+0

En fait, dans Ibatis est trivial de sélectionner des bases de données à l'exécution si vous le souhaitez. Vois ma réponse. – cletus

Répondre

11

Travailler avec les noms de tables dynamiques est trivial dans Ibatis. Il suffit d'utiliser des expressions comme:

SELECT * FROM $tableName$ 

tableName est une propriété de la classe de paramètres.

Travailler avec les noms de tables dynamiques dans Hibernate (ou tout autre fournisseur JPA) est extraordinairement difficile si ce n'est pas pratique (ou même impossible). Cette question a déjà été soulevée. Voir JPA: How do I specify the table name corresponding to a class at runtime?. Travailler avec des sources de données dynamiques dans Ibatis vous demandera d'écrire du code, mais pas tant que ça. Fondamentalement, Ibatis fonctionne autour du concept d'un sqlMapClient, qui a une source de données et une liste de requêtes qu'il peut exécuter. Il suffit de créer un sqlMapClient pour chaque base de données, chacun avec une source de données différente, et de les inclure tous les mêmes fichiers de requête (dans la configuration sql map).

Un DAO peut être écrit de telle sorte qu'il ait plusieurs sqlMapClients injectés et qu'il sélectionne celui à utiliser lors de l'exécution. C'est la partie que vous devrez écrire vous-même, mais c'est simple.

Ceci est basé sur la connaissance des bases de données au moment de la compilation. Si la base de données n'est pas connue avant l'exécution, c'est un peu plus difficile. Cela peut être encore possible mais je ne suis pas sûr de savoir comment Ibatis va réagir si vous changez fondamentalement les sources de données à l'exécution à partir du sqlMapClient. Cela pourrait fonctionner, ça pourrait exploser. Vous devrez l'essayer et voir.

Hibernate peut également fonctionner ici selon le même principe: vous injectez plusieurs unités de persistance dans un DAO et utilisez la bonne à l'exécution. Avec Hibernate (ou tout autre fournisseur JPA), vous devrez faire attention à vous assurer que vos objets gérés sont stockés dans l'unité de persistance correcte. Je peux facilement voir cela devenir un cauchemar. Un commentaire général: il est déconseillé de suivre le chemin des noms de tables dynamiques ou des bases de données afin de vraiment considérer ce que vous faites et pourquoi et demandez-vous si cela pourrait être corrigé en faisant de meilleurs choix de conception.

+0

Merci! Très bonne réponse! Je dois envisager de changer la logique de cette mise en œuvre. – Yurish

1

Est-ce que les tables ont la même structure, juste des noms différents?

Il est certainement possible de mapper dans iBATIS.

Vous juste besoin d'inclure quelque chose comme ça dans votre carte SQL:

<select id="selectAll" resultMap="result" parameterClass="myParameterClass"> 
    SELECT ColumnA, ColumnB FROM $tableName$ 
</select> 

En supposant à juste titre que je l'ai bien compris votre question, qui devrait résoudre votre problème.

+0

Non, je sais que c'est possible dans iBatis, mais dans iBatis il est impossible de changer de base de données pendant l'exécution. – Yurish

1

Je ne comprends pas bien votre exigence, mais cela est une possibilité:

Les deux Hibernate et iBatis peut fonctionner à partir d'une source de données, vous pouvez donc créer votre propre implémentation de javax.sql.DataSource qui renvoie des connexions différentes chaque fois que getConnection() est appelée.

Using a DataSource in Hibernate

+0

Vérifiez la publication mise à jour. – Yurish

Questions connexes