【问题标题】:How to load a set of objects when Hibernate Lazy Fetchtype is used?使用 Hibernate Lazy Fetchtype 时如何加载一组对象?
【发布时间】:2009-07-13 05:00:55
【问题描述】:

我有一个 Hibernate 域类(比如说 PetOwner),它与另一个类(宠物)存在一对多关系

[PetOwner (1)---------(*) 宠物]

由于需要大幅更改以提高性能,我不得不更改 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。(由于 fetch 类型的更改,对象图未完全加载)

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

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

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

【问题讨论】:

    标签: java database hibernate


    【解决方案1】:

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

    我很好奇为什么你想要“渴望”获取而不将获取类型设置为渴望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多