Je suis en train de courir dans les exceptions de LazyLoading comme la plupart des gens qui essayent à distance avec un ORM. Dans la plupart des cas, le basculement vers la récupération désirée résout le problème (chargement paresseux/requêtes non atomiques/sécurité du filetage/problème n + 1 ...). Mais chercher ardemment a aussi des inconvénients si vous avez affaire à un très gros graphique d'objets.Stratégies de chargement Lazy/Eager dans les cas à distance (JPA)
Le chargement du graphe d'objet entier n'est pas nécessaire dans la plupart des cas d'utilisation. Il est mauvais de charger plus de données que nécessaire (ou de les charger à partir de la base de données et d'extraire le sous-ensemble nécessaire).
Alors, quelles sont les autres solutions pour résoudre ce genre de problème (lors de l'exécution)?
J'ai vu:
- Injecter une dépendance d'accès aux données en objet de domaine et laissez l'objet décider soit de charger paresseux ou désireux: se sent mal! La couche de domaine doit être indépendante de tout service. L'injection de domaine est également une opération coûteuse. Le domaine devrait être ignorant de l'accès aux données et devrait être utilisé avec ou sans accès aux données.
- Récupère tout paresseux sauf les cas d'utilisation qui nécessitent plus de données: Cela semble meilleur pour les performances mais force ainsi de nombreux clients => allers-retours serveur/base de données. L'initialisation des champs paresseux peut également souffrir de la douleur (essayé avec JPA). De cette façon, ne semble pas générique et fait l'objet des mêmes restrictions paresseux mentionnées ci-dessus.
- Encapsuler la persistance dans la classe Lazy: Plus de complexité, pas de meilleure pratique pour l'interopération avec ORM. Couche de services de ballonnements (tellement de code "manuscrit" se sent mal).
- Utilisez des projections complètes pour chaque cas d'utilisation: nous finirons dans SQL et perdrons l'avantage d'un ORM.
- Une couche DTO/Virtual Proxy renforce la complexité et rend le code plus difficile à maintenir (Wormhole antipattern >> Bloat).
Je pensais beaucoup à une autre façon. Peut-être que la projection générique white./black listning est une solution. Idée (liste noire): définit une liste de classes avec les limites d'une opération de récupération. Si une propriété correspond et qu'elle est paresseuse, supprimez le proxy paresseux (CGLIB) et remplissez la valeur avec null. Sinon, simple empêche d'aller chercher (et laisse la valeur à null). Nous pouvons donc définir des limites claires dans nos DAO.
Exemple: ProductDao.findByName("Soap",Boundaries.BLACKLIST,"Category, Discount")
les deux derniers paramètres peuvent également être liés dans un objet Boundaries. Idea (whitelist): Comme la liste noire, mais vous devez déclarer les propriétés qui doivent être chargées dans une liste blanche.
Que pensez-vous d'une telle solution? (Problèmes possibles, restrictions, avantages ...) Comment dois-je écrire cela dans java? Peut-être via AOP pour faire correspondre les méthodes DAO (parce que je suis capable de modifier le comportement proxy cglib là-bas)?
Quel type d'architecture avez-vous? Utilisez-vous GWT, par exemple? – Kaitsu
Services Web JAX-WS via une implémentation de référence (Metro) –