Question

Alors je travaille sur un projet (JSF2, Spring3 de base, MVC, Webflow, MyBatis3, RichFaces, et un héritage Oracle 10g). La source de tous mes ennuis de a à voir avec la conception de la base de données. Le problème est que la plupart des tables de DB ont changer le schéma (mauvaise conception peut-être?). Donc, je dois être en mesure de soutenir l'ajout et la suppression des colonnes supplémentaires.

Pour tenir compte de ce que j'ai fait des données de traction mybatis dans un objet de domaine « universel » personnalisé qui étend fondamentalement juste un hashmap. Ma question actuelle est de mettre à jour ces objets HashMap. Il devrait y avoir un moyen de le faire fonctionner, mais je peux sembler obtenir mybatis à coopérer. Je l'ai essayé d'utiliser HashMap.entrySet () et mybatis de, mais en vain. par exemple.

UPDATE MYTABLE
SET 
<foreach collection="entries" index="i" item="entry" close=""  open="" separator=", ">
  #{entry.key} = #{entry.value}
</foreach>
WHERE FOO='BAR';

J'ai essayé un TypeHandler personnalisé mais setParameter () ne me donne pas un accès suffisant pour faire ce que je dois. Un ResultHandler ne me donne pas un accès suffisant à chaque résultat, donc je ne pouvais pas utiliser non plus.

Maintenant, je sais que je pouvais faire quelque chose comme Obj.createUpdateSqlString () et l'insérer dans le mappeur comme une chaîne littérale, mais c'est un peu un hack et des feuilles me ouvre à l'injection SQL. Sans parler qui impliquerait échapper à un grand nombre de chaînes, et représentant un large éventail d'entrée possible, et à moins que toutes les possibilités sont couvertes qui ouvre la porte pour quelques bugs graves.

est-il un moyen mis en place pour le faire? Ou atleast une façon décente à mi-chemin? J'ai entendu un certain nombre de défenseurs de mybatis hardcore disent qu'ils ont encore rencontré une situation mybatis ne pouvait pas gérer avec élégance; donc les experts mybatis, s'il vous plaît aidez-moi !!

Était-ce utile?

La solution

On dirait qu'ils essayaient d'éviter d'utiliser des tables de EAV.

Vous devez choisir votre poison quand il vient à des champs dynamiquement en ajoutant. EAV est bon du point de vue de la théorie, mais a de sérieux problèmes de performance sur de grandes tables. Bien que l'ajout de colonnes dynamique est meilleure pour les performances des requêtes que vous avez à traiter avec une interface de table à langer et sql dynamique. Je ne voudrais pas écrire la base de données hors comme une mauvaise conception pure et simple.

Vous pouvez vouloir contourner le cadre que vous utilisez. Consulter le schéma de la table (pour regarder Oracle à USER_TAB_COLUMNS) et générer les scripts d'insertion / mise à jour. de sorte que vous les paramétrer êtes à l'abri de l'injection. Ce sera un mal de tête, mais je ne vois pas une alternative.

Autres conseils

mybatis ou veille prolongée à la fois avec schemeas pue la base de données fous. Je voudrais simplement utiliser SpringJDBC ou similaire.

Ne pas essayer de faire un ajustement de cheville ronde dans un trou carré, même si elle est une cheville ronde très agréable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top