我有很多子对象的父对象,所以不能使用EAGER。 我尝试了多种样式来获取父对象的所有子对象,但是 下面的大小代码,我尝试过的其他所有操作都会抛出
failed to lazily initialize a collection of role xxxx, could not initialize proxy - no Session
如何初始化所有子对象?我真的需要对所有这些都进行另一个查询吗?似乎有点愚蠢。
@Transactional
public List<XXX> findYYYinXXX(Long id) {
List<XXX> list = xxxRepo.findYYY(id);
for (XXX p : list){
p.getChild().size();
}
return list;
}
Hibernate.initialize(p.getChild);在for循环内使用也会引发相同的错误
答案 0 :(得分:1)
如果您使用的是generalKnowledge
,则在调用lazy=extra
或size
时不会初始化代理集合,请参见this answer。
您可以生第一个孩子,而不用打电话给孩子。
但是,您的问题没有道理,因为您想获取EAGER,但您正试图强制加载子项。我认为您真正想要的是也使该isEmpty
的客户端也成为事务的一部分,因此,如果它需要加载子级,它将不会失败。
答案 1 :(得分:1)
如果您正在使用spring-boot,则可以在application.properties
文件中设置以下属性以保持延迟加载:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
答案 2 :(得分:0)
在父类中,使用访存类型为Eager。
1)使用预取类型。
就像@OneToMany(fetch = fetchType.Eager)
2)使用联接获取查询。
在创建查询时使用提取联接。
例如String hql = "select p from ParentClass p join fetch p.child_class_instance;
作为一个提示:在这种情况下,使用@ElementCollections至少需要使用@CollectionTable(name =“ TABLENAME”,schema =“ SCHEMANAME”)