2008-12-16 8 views
1

Mon équipe développe une grande application Java qui interroge une base de données MySQL (dans différentes classes et modules). Je voudrais savoir s'il existe un modèle qui me permet d'être averti lors de la compilation s'il y a des requêtes qui se réfèrent à une mauvaise structure de table (par exemple si je supprime ou ajoute un champ sur une table et la chaîne de requête pour éviter les erreurs d'exécution. Cela devrait également fonctionner pour les requêtes JOIN.Modèle pour la découverte à la compilation de requêtes dangereuses/incorrectes

Répondre

0

Il existe un outil open-source appelé DODS (Data Object Design Studio) qui pourrait faire ce que vous voulez. L'outil DODS faisait à l'origine partie du projet de serveur d'applications Java Enhydra, et depuis que la société soutenant ce projet est allé à kablooey en 2002, DODS a été hébergé et maintenu à ObjectWeb. Quoi qu'il en soit, c'est open-source (LGPL).

http://forge.objectweb.org/projects/dods

Le concept est que vous décrivez votre schéma dans un fichier XML, et DODS génère des classes Java POJO avec lequel vous pouvez interroger et manipuler les tables de base de données. Bien sûr, chaque fois que vous modifiez votre schéma, vous devez réexécuter DODS pour générer à nouveau les classes ORM et recompiler votre application à leur place. Le résultat est que si une table ou une colonne disparaît et que votre application interroge des métadonnées de base de données qui n'existent plus, vous obtenez une erreur de compilation, car votre code appelle maintenant une classe ou une méthode correspondante. existe plus longtemps.

0

Je dirais que la réponse simple est "non". La réponse la plus complète est «oui, dans une certaine mesure», selon votre volonté de sauter dans les cerceaux. À moins que vous n'ayez une représentation java de votre schéma de base de données, vous ne serez jamais en mesure d'obtenir une notification de compilation si vos requêtes sont erronées (ces classes peuvent être générées). En outre, vous devez utiliser ces classes pour générer vos requêtes, de sorte que la méthode que vous utilisez aujourd'hui (chaînes de requête) doit être abandonnée. Pour pouvoir utiliser les classes Java pour créer vos requêtes, vous devez également utiliser des astuces. LiquidForm utilise les astuces requises pour générer des requêtes JPA, mais je n'ai pas vu de bibliothèque similaire pour construire des requêtes SQL (LiquidForm est nouveau et plutôt brillant). Vous devriez en fait construire une bibliothèque similaire. Donc, comme vous le voyez, obtenir des avertissements de compilation lors de la construction de SQL est difficile, mais pas impossible (seulement presque impossible). Mais même si vous devriez être capable de créer ce que je suggère, votre représentation java du schéma doit être mise à jour immédiatement après un changement de schéma, donc la génération de classes java devrait être intégrée dans votre IDE ou outil de construction.

Je vous suggère plutôt d'avoir de bons tests unitaires qui remarqueront que vos requêtes deviennent illégales suite à un changement de schéma. C'est la façon la plus courante d'obtenir ce que vous voulez. Aussi, si vous décidez de "mettre à niveau" vers JPA, vous pouvez utiliser LiquidForm pour obtenir ce que vous voulez.

1

Querydsl est similaire à LiquidForm et prend en charge les backends JPA/Hibernate et SQL.

Pour la version SQL, nous supportons actuellement MySQL (5.? Testé), Oracle (testé 10g) et HSQLDB.

En bref une requête comme celui-ci

select count(*) from test where name = null 

deviendrait

long count = query.from(test).where(test.name.isnull()).count(); 

Querydsl SQL utilise la génération de code pour refléter les schémas SQL dans les classes Java.

Questions connexes