您正在遇到一个众所周知的问题,也就是“ N + 1选择”。简而言之,当您选择父实体时,“ N + 1选择”问题就会发生,并且休眠将使用OneToOne对与父相关的子项进行附加选择。因此,如果数据库中有“ N”个父子记录,hibernate将使所有父项具有一个选择,然后使每个子项处于单独的选择中,从而使N + 1个选择合计。 在休眠状态下,有两种方法可以解决“ N + 1”问题: 1.“加入获取” OneToOne子级。 2.启用二级缓存,并在OneToOne子级上使用@Cache批注。
您的问题是您没有“加入获取”所有的OneToOne子代。您必须“加入”所有对象,包括可传递的子代(从子代本身或集合中引用的实体)。
使OneToOne变得懒惰(因为默认情况下它很渴望)只是部分解决方案,因为仅当您访问子代上的某个getter时,休眠才会为子代选择一个选项,但是从长远来看,它仍然会使所有N个选择。