2009-05-22 9 views
2

Comme mes publications précédentes peuvent en attester, je suis en train de rééquiper les performances en cache, mises en cache réseau, de ce qui était auparavant un scénario entièrement hiberné. Ce faisant, je rencontre des problèmes lorsque je traite des objets mandatés et que j'ai besoin de me rattacher aux sessions, mais en faisant cela, je veux aussi maintenir la transactabilité. Quelles sont les meilleures pratiques pour déplacer la logique complexe hors de la couche d'hibernation? Je viens juste de "complètement" entrer en hibernation, donc c'est une expérience plutôt détestable. Quelqu'un qui a travaillé sur ce type de transfert de données peut-il nous expliquer comment vous avez surmonté le problème des transactions, comment traiter les objets mandatés, etc.? Je suis à la recherche de ressources générales en ce moment, car j'ai du mal à nager.Quelle est la meilleure façon d'extraire des données de la couche d'hibernation et de les placer dans un autre niveau?

Merci.

Répondre

2

Vous devez décider sur 2 choses:

  • Votre stratégie de gestion de session
  • Votre stratégie de récupération associée

Il est bon post par Ga Vin King qui explique certaines des options pour gérer les sessions (le poste est sur la performance, mais est généralement applicable aussi). En ce qui concerne la récupération, une chose à considérer est d'augmenter le nombre de primitives rendues disponibles par votre couche Hibernate. Par exemple. Imaginons que vous ayez une entité Foo qui a une relation 1-N avec Bar et dans certaines circonstances, vous n'avez besoin que des objets Foo, mais dans d'autres vous avez besoin des objets Foos et Bar. Vous pouvez les représenter comme des appels distincts à la couche Hibernate.

class HibernateLayer { 
    public List<Foo> findFoo(String someCriteria) { 
     Query q = new Query("from Foo f where f.someCriteria = :1"); 
     //... 
    } 

    public List<Foo> findFooWithBars(String someCriteria) { 
     Query q = new Query("from Foo f left join fetch Bar b where f.someCriteria = :1"); 
     //... 
    } 

Cela a 2 avantages, 1 vous ne traitera pas avec des objets proxy chargés paresseux, vous aurez toutes les données dont vous avez besoin et remplirai mieux que le SQL généré sera plus approprié à la situation . Cependant, il aura l'inconvénient que vous aurez besoin de savoir avant d'appeler la couche Hibernate si vous aurez besoin ou non du niveau de données plus profond. Pour s'assurer que vos données restent cohérentes (l'objectif principal des transactions) assurez-vous d'utiliser optimistic locking au minimum.

Questions connexes