2010-12-04 2 views
2

Je veille prolongée apprendre et poser une question au sujet de la conception de ma classe POJO j'ai une destination de classe avec quelques propriétés commeQuestion sur la conception de classe Hibernate POJO

private Set<AirTransport> airTransport; 
private Set<RoadTransport> roadTransport; 
private Set<TrainTransport> trainTransport; 

puisque ceux-ci sont refrence à d'autres classes d'entités , Ma question est quand je vais chercher ma classe de destination, je ne veux pas que ces documents soient chargés dans la mémoire afin qu'ils puissent les récupérer plus tard lorsque l'utilisateur clique sur l'un des liens comme (airtransport). atteindre de la meilleure façon. Je ne suis pas à Hibernate alors s'il vous plaît corrigez-moi où jamais je me trompe.

Thnaks à l'avance

+0

n'ajoutez pas [fermé] aux titres de votre question. Cela signifie une autre chose - quand une question est fermée pour ne pas être pertinente pour stackoverflow (ou pour être spam), '[closed]' est ajouté automatiquement. Le fait que la réponse à la question soit réussie est indiqué par la réponse acceptée. – Bozho

+0

+1 Thnaks pour le pointeur .. :) –

Répondre

2

Ceci est appelé "chargement paresseux". Par défaut, toutes les collections dans Hibernate (et JPA) sont chargées paresseusement - c'est-à-dire qu'elles ne sont pas chargées jusqu'à ce qu'elles soient accédées. Donc, par défaut, votre objet ne récupérera pas toutes les données.

Mais le chargement paresseux a ses complications. Si vous essayez d'accéder à une collection lorsque la session de mise en veille prolongée a été fermée, une exception est levée. Et comme il semble que vous aurez besoin des collections après que l'utilisateur fasse une action (clique sur un bouton).

Pour ce cas, vous avez deux options:

  • lorsque l'utilisateur clique sur le bouton, vous chargez à nouveau l'entité, et initialiser la collection désirée. Soit par Hibernate.initialize(..) ou en l'itérant dans la vue. Notez que les sessions sont normalement fermées avant que la vue ne soit rendue, donc vous pouvez avoir besoin de OpenSessionInViewFilter

  • ne pas utiliser les collections du tout. Ils ont un comportement limité de toute façon. Utilisez HQL ou l'API de critères pour extraire les résultats. Cela vous permet d'avoir la pagination, et vous ne pensez pas à des problèmes paresseux

+0

Merci pour la réponse rapide et oui d'accord ce que vous avez dit.mais puisque ma classe de destination sera la classe conteneur parent et qui sera responsable de fournir à chaque fois informations sur la destination, donc je pense que l'utilisation de la collecte est appropriée dans ce cas. en chargeant l'entité vous voulez dire que je devrais mettre quelques méthodes d'utilité dans la classe de destination ou quelque chose d'autre? –

+0

bien, je veux dire que vous devriez le récupérer en utilisant 'session.load (..)' (ou 'get (..)'), basé sur son identifiant. – Bozho

+0

Merci pour l'aide –

0

Ceci est appelé Lazy Fetch dans le monde ORM. Lisez le tutoriel here. Vous pouvez également lire à propos du modèle associé: Open Session in View

+0

Merci pour les liens –