TL; DR 即使我们在字段访问中使用字节码增强功能,load()也会导致代理对象。为什么?有什么好处?没有代理,我们能否获得load()惰性?这是出乎意料的,还会给我们造成一些测试失败。
上下文(如果匆忙则跳过):
我们正在将一个大型的旧应用程序从旧版本的Hibernate更新到5.4。出于众多未来的考虑,我们选择使用字段访问(以前是属性)并构建时间字节码增强功能(所有字段都是私有的,所有实体类都包含在一个项目中)。
旧的应用程序开发人员努力使某些东西延迟加载(无论是好是坏),但是由于错过了很多东西,所以他们没有成功,包括将许多属性声明为急切地加载到原始hbm.xml文件中(我们将其转移到所有懒惰的注释上,并将使用实体图来指定每个用例急切加载的内容。
我们到了一个地步,只有成千上万的测试中的少数失败了更新的代码。有些失败是因为违反了我们的实体“名称”(属性)重复约束(对于API客户端,不是DB客户端很明显),并且我们跟踪到的一件事是使用load()与get()方法来获取一些内容实体。
现在,我不是在这里寻找实际缺陷的时候寻求帮助,而是消除了我的困惑,即使在主类在构建时已“增强字节码”,load()仍会返回代理对象这一点令人惊讶。我认为这不再是必需的(具有字节码增强功能),并且即使相同/主类,它们甚至load()都将返回该实例,也许只是“初始化较少”。
在任何情况下,如果我将load()更改为get(),则测试通过,并且我正在考虑仅将它们全部替换为get(),但担心除可能的小型SQL select外,我可能会缺少的其他好处(因为所有属性都被映射为最后)。有人可以帮助我了解在字节码增强情况下load()的原因和好处吗?