2010-02-12 2 views
0

Donc dans un projet récent (un petit outil interne), je veux expérimenter avec et non en utilisant un outil ORM que nous utilisons généralement dans tous nos projets. La raison en est que je ne suis pas particulièrement fan d'eux, en particulier dans des projets complexes avec des hiérarchies d'objets et des relations complexes. À l'aide d'un ORM, il devient difficile de déboguer les problèmes de performance et d'autres problèmes découlant de beaucoup de choses que la bibliothèque ORM pourrait faire sous les couvertures pour «optimiser».Représenter des objets incomplets lors du chargement de la base de données

Donc je pensais à un moyen de charger paresseux certaines propriétés d'objets quand je n'ai pas l'aide d'un outil ORM. Supposons un exemple:

class Student { 
private List<Course> courses; 

public List<Course> getCourses() {...} 
public void setCourses(List<Course> courses) {...} 
} 

Dans ce cas, nous mettons paresseusement des "cours". Donc je veux un moyen de faire la différence entre un scénario dans lequel les "cours" n'ont pas été chargés depuis la base de données et quand "cours" est en fait nul même après avoir été extrait de la base de données.

Quels sont les moyens habituels pour y parvenir? Je pensais que probablement associer un objet vide spécial de type "Course" indiquant qu'en fait aucune donnée n'existe dans la base de données. Et le java null signifierait que les données ne sont pas extraites de la base de données. Mais cela casserait un peu l'abstraction dans le sens où le getter pour de telles propriétés paresseuses doit prendre la décision d'accéder au DAO pour obtenir les données.

Répondre

1

Si vous n'aimez pas les bibliothèques ORM standard comme Hibernate, pourquoi n'utilisez-vous pas un outil comme iBATIS? iBATIS est une maison à mi-chemin entre Hibernate et SQL. Essentiellement, il mappe les ensembles de résultats aux objets Java, mais il n'écrit aucun code SQL pour vous. Nous sommes passés à Hibernate après - comme vous - en découvrant que Hibernate ne fonctionne pas très bien pour les schémas plus complexes.

Il prend en charge l'amélioration de classe dynamique, mais il permet également d'éviter N + 1 sélections en mettant la jointure en SQL (désolé, c'est mal expliqué, mais vérifiez le user guide pour plus d'informations).

Quoi qu'il en soit, pour répondre à votre question, je l'implémenterais probablement en utilisant cglib ou quelque chose de similaire pour améliorer une classe (créer une sous-classe dynamique). Vous gardez une carte des propriétés qui ont été chargées ou non, et vous n'avez pas besoin de valeurs spéciales.

Cependant, je pense que c'est probablement une meilleure idée d'utiliser une bibliothèque qui existe déjà, réinventer la roue n'est jamais une bonne idée si possible.

0

Vous pouvez différencier les cours ne sont pas chargés et courses étant chargé mais vide en utilisant null impliquer « non chargé » et un vide Collection de laisser entendre « chargé mais pas de cours disponibles ».

Cependant, ma préférence serait de lancer une RuntimeException (par exemple IllegalStateException) si l'accesseur est appelé mais que les données n'ont pas encore été chargées paresseusement. Cela rend le débogage beaucoup plus facile et évite le besoin de vérifications dans tout votre code.

Questions connexes