Hibernate lazy fetch 无法加载子对象
Hibernate lazy fetch unable to load child objects
我的父对象有很多子对象,所以不能使用 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 循环中使用也会抛出相同的错误
在你的父 class 中使用获取类型 Eager。
1) 使用预取类型。
喜欢@OneToMany(fetch = fetchType.Eager)
2) 使用 join fetch 查询。
创建查询时使用 fetch join。
例如。 String hql = "select p from ParentClass p join fetch p.child_class_instance;
附带一提:在这种情况下使用@ElementCollections 至少需要使用@CollectionTable(name="TABLENAME", schema = "SCHEMANAME")
如果您正在使用 lazy=extra
,则代理集合在调用 size
或 isEmpty
时不会初始化,请参阅 this answer。
您可以获得第一个 child 而不是调用 size.
但是你的问题没有意义,因为你想要 EAGER 获取但你试图强制 child 加载。我认为你真正想要的是让这个 findYYYinXXX
的客户端也成为事务的一部分,所以如果它需要加载 childs 它不会失败。
如果您正在使用 spring-boot,您可以在 application.properties
文件中设置以下 属性 以保持延迟加载:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
我的父对象有很多子对象,所以不能使用 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 循环中使用也会抛出相同的错误
在你的父 class 中使用获取类型 Eager。
1) 使用预取类型。
喜欢@OneToMany(fetch = fetchType.Eager)
2) 使用 join fetch 查询。
创建查询时使用 fetch join。
例如。 String hql = "select p from ParentClass p join fetch p.child_class_instance;
附带一提:在这种情况下使用@ElementCollections 至少需要使用@CollectionTable(name="TABLENAME", schema = "SCHEMANAME")
如果您正在使用 lazy=extra
,则代理集合在调用 size
或 isEmpty
时不会初始化,请参阅 this answer。
您可以获得第一个 child 而不是调用 size.
但是你的问题没有意义,因为你想要 EAGER 获取但你试图强制 child 加载。我认为你真正想要的是让这个 findYYYinXXX
的客户端也成为事务的一部分,所以如果它需要加载 childs 它不会失败。
如果您正在使用 spring-boot,您可以在 application.properties
文件中设置以下 属性 以保持延迟加载:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true