Hibernate 不会初始化代理

Hibernate won't initialize proxy

我在 Hibernate 中得到了这个映射(通过 JPA,使用 EntityManager 等):

 public ChildClass {

     ....
      @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "parentClassId")
        private ParentClass parentClass;
     ....
    }

父级 class 具有 ChildClass 个元素的列表:

 public ParentClass {
    ...
    @OneToMany(mappedBy = "parentClass", fetch = FetchType.LAZY)
        private List<ChildClass> childElements;
    ...

    }   

现在我的服务层有了这个方法:

@Transactional
public ChildClassDTO consultarPuntuacionPrueba(Long parentClassId) {
            ChildClass result= childClassDAO.getChildClassByParentId(parentClassId);



            ParentClass parentClass = result.getParentClass();

            System.out.println("UNITIALIZED: " + ((HibernateProxy)prueba).getHibernateLazyInitializer().isUninitialized());


            Long parentClassId = parentClass.getParentClassId();
            Boolean anAttribute = parentClass.getBooleanAttribute();

            return map(result, ChildClassDTO.class);
        }

问题是 -- parentClass 是一个 javassist 代理,即使在访问 parentClass 的 getter 时,我也可以看到一个查询正在执行(它显示在我的控制台中),代理永远不会被初始化并且所有属性都为空...我已经尝试直接对我的数据库进行查询,并且它return是预期的数据。

我知道当我调用 childClass.getParentClass() 时 Hibernate 必须 return 一个代理,但为什么它之后从未初始化过?

正如您在映射中定义的那样,Hibernate 延迟加载映射的实体。这意味着映射实体仅在您访问它时加载(否则您只有一个代理实例)。因此,如果您希望映射实体被急切加载(没有代理),您可以将 FetchType 更改为 EAGER

确保您的实体 getter 和 setter 没有使用 final 关键字,否则代理将无法覆盖这些方法并且可能无法正常工作。