如何在使用Hibernate Lazy Fetchtype时加载一组对象?

时间:2009-07-13 05:00:56

标签: java database hibernate

我有一个Hibernate域类(让我们说PetOwner)与另一个类(Pets)有一对多的关系

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

由于改善性能所需的急剧变化,我不得不改变fetch的类型 PetOwner类中的getPets()方法是懒惰的。

所以当前的映射如下所示

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

对于某些测试类,在使用retrievePetOwnerById()方法找到PetOwner之后使用getPets()方法。对映射的更改导致 LazyInitializationException 。(由于更改了获取类型,对象图未完全加载)

我通过向DefaultPetOwnerService添加如下所示的方法,使用了一种不优雅的解决方法。

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

petOwner.getPets()。size(),因为在列表上的某些操作完成之前不会加载宠物。 当我使用新方法时,可以克服LazyInitializationException。但它是一个黑客,我正在寻找一种方式 做得更整齐。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

尝试使用Hibernate#initialize(Object)初始化您的对象。它应该解决集合引用。

我很好奇你为什么要在不设置获取类型的情况下“急切”获取。