【问题标题】:Hibernate won't initialize proxyHibernate 不会初始化代理
【发布时间】:2015-02-11 16:33:27
【问题描述】:

我在 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 为所有属性...我已经尝试直接对我的数据库进行上述查询,它会返回预期的数据。

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

【问题讨论】:

  • “parentClassId”是数据库中的fk列名吗?
  • 是的,在其他情况下映射工作正常......奇怪的是,这发生在我的大多数关系中
  • 您是否在您的实体中使用了 final 关键字?
  • 事实上——我愿意!现在我想我可以看到发生了什么——代理不能注入任何东西,因为它们不能覆盖 setter 方法,对吧?
  • 是的,这就是我的想法。添加它作为答案。

标签: java hibernate jpa proxy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这不是我的问题——正如我在我的 OP 中所说,我知道它是延迟加载的,我可以接受,问题是 访问代理的属性之后,我仍然得到空值,因为即使进行了正确的查询,代理也不会被初始化
    • 确实很奇怪
    猜你喜欢
    • 2014-11-27
    • 2011-07-12
    • 2012-11-09
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2020-06-07
    • 2016-12-27
    相关资源
    最近更新 更多