当前位置: 首页 > 面试题库 >

Hibernate递归初始化

陶永望
2023-03-14
问题内容

我正在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 SessionFactory, > 通过org.hibernate.cfg.configuration读取hibernate.cfg.xml进行配置,我将获得java代码

  • http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html 官方Spring医生说; 此外,将在启动时执行类路径根目录中名为import.sql的文件。 只有当hbm2ddl.auto设置为create或create-drop时,这也将工作。 我说教了很多,但找不到

  • 问题内容: 在Hibernate Envers中,实体的所有相关集合都是延迟加载的,而不管设置了什么获取类型。因此,当审计查询具有其他实体集合的实体(当然都是经过审计的)时,该集合首先是一个(在调试时可以看到)。 那么,如何初始化该代理?使用没有效果(我怀疑是因为Hibernate和Envers使用了不同的代理对象)。我知道我可以通过迭代项目来初始化集合,但是这对我来说不是一个选择,因为我在一个实

  • 今天我学习了一个教程,作者在其中解释了hibernate关联一对多/多对一。我不想把他所有的代码都写在这里。所以,我试着把重点放在。。。 我们有两个实体:“团队”和“球员” 在代码中,我们有: 和 我最感兴趣的是回迁的类型。所以,我们加入了一支球队和一些属于这支球队的球员。我的DAO类标记为 现在我想从数据库中加载充满玩家集合的团队实体。 结果是,我将得到LazyInitializationExc

  • 问题内容: 编译失败(出现错误),正如人们期望的那样: 但这有效: 这是怎么回事?在后一种情况下分配什么? 问题答案: 摘要:两个初始化程序都访问一个尚未初始化的字段(因此,其默认值为零)。由于这很可能是编程错误,因此该语言禁止了这种访问的某些简单形式。但是,它不禁止使用更复杂的形式。 该行为符合JLS,特别是第8.3.2.3节。初始化期间对字段的使用限制 只有在成员声明是类或接口的实例字段(分别

  • 我正在使用hibernate在两个java对象中映射两个数据库表。我使用@OneToMany和@ManyToMany hibernate注释,而不是用Java中的属性表示表的外键。问题是,当我想要得到对象的Json列表时,我得到了递归关系。 这是“父”对象客户。JAVA 这个对象有一个List,它是子对象的列表。现在Pratica.java类: 我使用Daos保存了一些客户和Pratica对象: