我正在休眠中编写一个函数来递归地递归初始化对象的所有属性,以便加载整个对象图。
我有两个复杂的场景需要使用它
1)自复合对象,如类别和子类别......
@Entity
public class Category {
@Column(nullable = false, length = 50)
@NotNull
@Size(max = 50, message = "{50}")
protected String name;
@ManyToOne(targetEntity = Category.class, fetch = FetchType.LAZY, optional = true)
private Category parentCategory;
}
2)复杂的对象图,在使用之前有很多对象需要初始化。
问题是我不能使用急切获取,因为我只在选择性情况下需要整个对象图,并且我想要通用代码,因此不需要为对象编写 HQL 查询。
我为此编写了部分代码,
public void recursiveInitliaze(Object obj) throws Exception {
if(!Hibernate.isInitialized(obj))
Hibernate.initialize(obj);
PropertyDescriptor[] properties = PropertyUtils.getPropertyDescriptors(obj);
for (PropertyDescriptor propertyDescriptor : properties) {
Object origProp = PropertyUtils.getProperty(obj, propertyDescriptor.getName());
if (origProp != null) {
this.recursiveInitliaze(origProp);
}
if (origProp instanceof Collection && origProp != null) {
for (Object item : (Collection) origProp) {
this.recursiveInitliaze(item);
}
}
}
}
但它有一个问题,由于双向关系,它最终进入方法调用的stackoverflow。那么如何检测是否存在双向关系或者有没有更好的方法来实现呢?
我认为 fetch profile 也可以提供帮助,但如果可能的话,仍然想尝试实现这一点,因为在项目的当前阶段配置 fetch profile 很困难。