我正在hibernate中编写一个函数以递归方式初始化对象的所有属性,以便加载整个对象图。
我有两个需要使用的复杂场景
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以进行方法调用。那么如何检测到存在双向关系,或者有没有更好的方法来实现呢?
我认为获取配置文件也可以提供帮助,但是如果可能的话,仍然想尝试实施此配置,因为在项目的当前阶段配置获取配置文件很困难。
您可以Hibernate.initialize()在对象上使用对其进行初始化。我不确定这是否会级联。否则,您可以检查instanceof HibernateProxy哪个为您提供了isInitialised属性。
Hibernate.initialize()
instanceof HibernateProxy
更新:由于初始化不会级联,因此您需要像遍历树一样遍历树。使用哈希集跟踪已处理的对象。