Hibernate paresseux-charge de la conception de l'application

J'ai tendance à utiliser Hibernate en combinaison avec Printemps cadre et il déclaratif de la démarcation des transactions capacités (par exemple, @Transactional).

Comme nous l'avons tous connu, hibernate essaie d'être aussi non-invasive et comme transparent que possible, cela prouve un peu plus difficile lors de l'embauche de lazy-loaded relations.


Je vois un certain nombre d'alternatives de conception avec les différents niveaux de transparence.

  1. Établir des relations, pas paresseux-chargé (p. ex., fetchType=FetchType.EAGER)
    • Ce vioalites l'idée entière de chargement paresseux ..
  2. Initialiser des collections à l'aide Hibernate.initialize(proxyObj);
    • Cela implique relativement haut de l'accouplement à la DAO
    • Bien que nous pouvons définir une interface avec initialize, d'autres implémentations ne sont pas garantis pour fournir un équivalent.
  3. Ajouter transaction comportement à la persistance de la Model objets eux-mêmes (à l'aide de dynamique proxy ou @Transactional)
    • Je n'ai pas essayé la dynamique proxy approche, bien que je n'ai jamais semblait @Transactional de travail sur la persistance des objets eux-mêmes. Probablement en raison qu'hibernate est l'opération sur un proxy pour bein avec.
    • Perte de contrôle lorsque les transactions sont effectivement lieu
  4. Fournir à la fois paresseux/non-paresseux de l'API, de l'e.g, loadData() et loadDataWithDeps()
    • Les Forces de l'application pour savoir quand employer qui de routine, de nouveau couplage
    • Méthode de débordement, loadDataWithA(), ...., loadDataWithX()
  5. Force de recherche pour les dépendances, par exemple, en ne communiquant byId() opérations
    • Nécessite beaucoup de non-orienté-objet, des routines, par exemple, findZzzById(zid), puis getYyyIds(zid) au lieu de z.getY()
    • Il peut être utile de chercher chaque objet dans une collection un par un, si il y a une grande surcharge de traitement entre les transactions.
  6. Faire partie de la application @Transactional au lieu de seulement la DAO
    • Possible considérations de transactions imbriquées
    • Nécessite des routines adaptées pour la gestion des transactions (par exemple, suffiently petit)
    • Petit impact programmatique, bien que peut entraîner de grandes transactions
  7. Fournir la DAO avec dynamique extraction de profils, par exemple, loadData(id, fetchProfile);
    • Applications doit connaître le profil à utiliser lors de la
  8. AoP type de transactions, par exemple, d'intercepter les opérations et d'effectuer des transactions lorsque nécessaire
    • Nécessite byte-code de la manipulation ou de l'utilisation de proxy
    • Perte de contrôle lorsque les transactions sont effectuées
    • De la magie noire, comme toujours 🙂

Ai-je raté une option?


Qui est votre approche préférée lors de la tentative de minimiser l'impact de lazy-loaded relations dans la conception de votre application?

(Oh, et désolé pour WoT)