我使用Spring JpaRepository访问数据库。我的目标是创建一个方法,找到一个实体并完全初始化它。目前我这样做:
Hibernate.initialize(business.getCollectionA());
Hibernate.initialize(business.getCollectionB());
Hibernate.initialize(business.getCollectionC());
所以我搜索一个像这样一次初始化所有集合的方法:
Hibernate.initializeAll(business);
答案 0 :(得分:1)
因此Hibernate
或JPA
未提供任何实用程序来初始化该实体的所有lazy properties
。
您需要编写recursive
逻辑,使用Java Reflection
遍历树并初始化对象。
您可以更多或更少地找到here。
答案 1 :(得分:0)
您可以将集合属性标记为FetchType.EAGER
,以便在加载实体后立即自动加载它们。
e.g。
@OneToMany(fetch=FetchType.EAGER)
private Set collectionA;
将此fetchtype添加到您想要“初始化”的任何集合中。请注意,这会导致性能下降,但它与在每个集合上调用initialize具有相同的效果。
答案 2 :(得分:0)
这个怎么样:
import org.hibernate.SessionFactory;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.type.CollectionType;
import org.hibernate.type.Type;
// you should already have these somewhere:
SessionFactory sessionFactory = ...
Session session = ...
MyEntity myEntity = ...
// this fetches all collections by inspecting the Hibernate Metadata.
ClassMetadata classMetadata = sessionFactory.getClassMetadata(MyEntity.class);
String[] propertyNames = classMetadata.getPropertyNames();
for (String name : propertyNames)
{
Object propertyValue = classMetadata.getPropertyValue(myEntity, name, EntityMode.POJO);
Type propertyType = classMetadata.getPropertyType(name);
if (propertyValue != null && propertyType instanceof CollectionType)
{
CollectionType s = (CollectionType) propertyType;
s.getElementsIterator(propertyValue, session); // this triggers the loading of the data
}
}