Java 在复制构造函数中使用直接字段访问而不是getter会导致空指针异常

Java 在复制构造函数中使用直接字段访问而不是getter会导致空指针异常,java,hibernate,copy-constructor,lombok,intellij-lombok-plugin,Java,Hibernate,Copy Constructor,Lombok,Intellij Lombok Plugin,它一定是Java101,但我不明白为什么我不能使用直接字段访问,为什么我被迫在复制构造函数中使用getter 我有很多实体。它们像树一样组织起来。链接实体被急切地抓取 我使用Hibernate、Lombok和IntelliJ作为调试器 当我通过根拉动一个实体树时,我得到一个对象树。让我们称之为“原创”。出于某些与业务需求相关的原因,我需要复制它(我们称之为“副本”)。我使用复制构造函数来实现它。 我首先使用直接字段访问编写了复制构造函数的一个版本 this.someField= origina

它一定是Java101,但我不明白为什么我不能使用直接字段访问,为什么我被迫在复制构造函数中使用getter

我有很多实体。它们像树一样组织起来。链接实体被急切地抓取

我使用Hibernate、Lombok和IntelliJ作为调试器

当我通过根拉动一个实体树时,我得到一个对象树。让我们称之为“原创”。出于某些与业务需求相关的原因,我需要复制它(我们称之为“副本”)。我使用复制构造函数来实现它。 我首先使用直接字段访问编写了复制构造函数的一个版本

 this.someField= original.someField
它不起作用。当我检查调试器时,我看到original.someField(以及其他字段)始终为null

然而,它使用getter工作

 this.setSomeField(original.getSomeField())
在调试器中,我可以看到字段在original.handler.target中被“设置”。(我不知道handler.target是什么)

有人能给我解释一下为什么直接现场访问不起作用吗?
(我问的是技术原因,而不是哲学原因,比如“你应该总是使用getter”等等)

我也很高兴知道什么是“handler.target”


提前谢谢。

据我所知,您正在获取代理对象,一旦调用getter方法,您将获得实际对象。请检查一下,一旦调用getter方法,之后对象的字段仍然为空?尝试使用。运算符调用getter后,我认为字段中的值应该出现

您遇到的根本不是Java 101问题。Hibernate有一个称为lazyloading的特性,它允许框架将(可能很重的)对象的加载推迟到以后的某个时间点,只有在需要时才进行加载。例如,当您加载
帐户
对象只是为了检查
活动
标志,但绝对不需要使用此帐户获取所有登录历史记录时,这非常方便

现在是“仅在需要时”部分:getter

Hibernate知道,当您在对象图中调用父对象上的getter时,确实需要这个可延迟加载的对象。在执行此操作之前,延迟引用的对象将保持空。直接变量访问绕过执行此“技巧”的ProxLogic,这就是获得意外空值的方式。当通过其getter访问该字段时,代理代码将启动,加载发生,您将获得您的对象


handler/target/etc
只是由于代理而需要对hvae进行的额外引用。(您的
帐户
将不再有直接的
accounthistory
变量,而是一个
accounthistory\u代理
,该代理将有一个
accounthistory\u real

请显示进行复制的代码以及您如何调用该代码code@Lino这只是一堆“this.someField=original.someField”声明。没有别的了,谢谢。我认为Hibernate只会在获取类型不是“渴望”的情况下延迟加载关系中的实体,但会加载实体字段。