gpt4 book ai didi

hibernate - Hibernate递归初始化

转载 作者:行者123 更新时间:2023-12-03 14:10:05 25 4
gpt4 key购买 nike

我正在休眠中编写一个函数,以递归方式初始化对象的所有属性,以便加载整个对象图。

我有两个需要使用的复杂场景

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 - Hibernate递归初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11445099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com