java - JPA/Hibernate 代理未获取真实对象数据,将所有属性设置为空

标签 java hibernate jpa javassist

我将 Hibernate 与 JPA 结合使用,并且有如下所示的关系:

public class PencilImpl implements Pencil {

    @ManyToOne(targetEntity = PersonImpl.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "owner", nullable = false)
    private Person owner;

    ...

    @Override
    public final Person getOwner() {
        return owner;
    }
}

自从我开始使用 LAZY 获取类型以来,每次我尝试获取铅笔的所有者 (pencil.getOwner) 时,我都会得到一个非 null 对象,该对象的所有内部属性都设置为 null。

我看起来 Hibernate 创建的代理没有在应该的时候从数据库中获取真实的对象。

有什么想法吗?谢谢:)

最佳答案

这就是 Hibernate 实现延迟加载的简单方式。它会给你一个代理对象而不是你的实体类的实例。当你说

a non-null object that has all of it's inner properties set to null

这可能是您在调试器中看到的,对吧?你不必担心这一点,一旦你通过代码或通过调试器内部的调用访问这些属性中的任何一个,Hibernate 将在后台从数据库加载数据,构造你的实体类的实例和所有调用代理对象将透明地委托(delegate)给实际实体。 所以通常情况下,理想情况下,您不必关心 Hibernate 代理 <-> 实体对象的区别。

无论如何,我可以想到两个原因来了解这种区别:

  1. 性能:当您在循环中访问延迟加载集合的元素时,延迟加载确实会减慢您的应用
  2. 继承:如果您的数据模型使用继承,请务必小心使用 instanceof 和强制转换。阅读this SO question关于如何测试对象是否为 Hibernate 代理以及如何将其转换为真实实体对象

关于java - JPA/Hibernate 代理未获取真实对象数据,将所有属性设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8945365/

相关文章:

java - 是否可以将 count(*) 和 groupBy 添加到 Spring Data Jpa 规范?

java - JPA 支持外连接,无需对象关系映射

java - 动态 JPA @JoinColumn 名称

java - 您将哪种 Java 类型用于 JPA 集合,为什么?

Java 分配类值

java - 在Java中,如何删除Sqlite表

java - 从 Spring Web 应用程序捕获用户名以供触发器使用

Java NoClassDefFoundError

java - Facebook Audience Network 导致 NullPointerException

java - 如何确保线程不会在 Java 中延迟?