【发布时间】: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。但这是一个黑客,我正在寻找一种方法 更整洁地执行此操作。有什么建议吗?
【问题讨论】: