我需要一个帮助程序来了解是否已加载属性以避免LazyInitializationException
。有可能吗?
@Entity
public class Parent {
@OneToMany
private List<Child> childList;
}
@Entity
public class Child {
}
"select distinct p from Parent p left join fetch p.childList";
// Answer goes here
// I want to avoid LazyInitializationException
SomeHelper.isLoaded(p.getChildList());
答案 0 :(得分:13)
实际上有两种方法。
要确定是否已初始化惰性属性,您可以使用实体实例和属性名称作为参数调用Hibernate.isPropertyInitialized()
方法。
要确定是否已初始化惰性集合(或实体)(如您的示例中所示),您可以使用集合(实体)实例作为参数调用Hibernate.isInitialized()
。
答案 1 :(得分:0)
根据documentation for Hibernate 5.4
休眠API
boolean personInitialized = Hibernate.isInitialized(person);
boolean personBooksInitialized = Hibernate.isInitialized(person.getBooks());
boolean personNameInitialized = Hibernate.isPropertyInitialized(person, "name");
JPA
在JPA中,有另一种方法可以使用 遵循javax.persistence.PersistenceUtil模式(即 尽可能推荐)。
PersistenceUtil persistenceUnitUtil = Persistence.getPersistenceUtil();
boolean personInitialized = persistenceUnitUtil.isLoaded(person);
boolean personBooksInitialized = persistenceUnitUtil.isLoaded(person.getBooks());
boolean personNameInitialized = persistenceUnitUtil.isLoaded(person, "name");