2009-07-13 6 views
0

J'ai une classe de domaine Hibernate (disons PetOwner) avec une relation un à plusieurs avec une autre classe (Animaux)Comment charger un ensemble d'objets quand Hibernate Lazy Fetchtype est utilisé?

[PetOwner (1) --------- (*) Pet]

En raison d'un changement radical requis pour améliorer les performances, j'ai dû changer le fetchtype de la méthode getPets() dans la classe PetOwner pour être paresseux.

Ainsi, la cartographie actuelle se présente comme suit

@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, mappedBy = "petowner") 
public Set<Pet> getPets() { 
    if (pets == null) { 
     pets = new HashSet<Pet>(); 
    } 
    return pets; 
} 

Pour certaines classes d'essai, la méthode getPets() est utilisé après une PetOwner se trouve en utilisant la méthode retrievePetOwnerById(). Une fois que les modifications apportées à la cartographie cela provoque LazyInitializationException. (Comme le graphe d'objet n'a pas été complètement chargée en raison du changement de type fetch)

I utilise une solution de contournement pas élégant en ajoutant un procédé tel que celui représenté ci-dessous pour la DefaultPetOwnerService.

public PetOwner retrievePetOwnerByIdWithPets(Long petOwnerId) { 
     PetOwner petOwner = retrievePetOwnerById(petOwnerId); 
     int size = petOwner.getPets().size(); 
     return petOwner; 
    } 

petOwner.getPets() taille.() doit être utilisé parce que les animaux ne seront pas chargés jusqu'à une opération sur la liste est fait. Lorsque j'utilise la nouvelle méthode, l'exception LazyInitializationException peut être surmontée. Mais c'est un hack et je cherche un moyen de le faire plus proprement. Y a-t-il des suggestions?

Répondre

1

Essayez d'utiliser Hibernate#initialize(Object) pour initialiser votre objet. Cela devrait résoudre la référence de la collection.

Je suis curieux de savoir pourquoi vous voulez récupérer "impatiemment" sans définir le type de fetch à être désireux cependant.

Questions connexes