Hibernate不会初始化代理

时间:2015-02-11 16:33:27

标签: java hibernate jpa proxy

我在Hibernate中有这样的映射(通过JPA,使用EntityManager等):

 public ChildClass {

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

包含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时,我可以看到一个查询被执行(它在我的控制台中显示),代理永远不会被初始化并保持对于所有属性都为null ...我已经直接向我的数据库尝试了查询,并返回了预期的数据。

我知道Hibernate在调用childClass.getParentClass()时必须返回代理,但为什么以后它永远不会被初始化?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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