对于OneToMany情况,一个人有一个地址集合。集合可以有0,一个或多个地址。该集合懒惰地填充。因此,当从数据库中加载人员时,将执行第一个查询以获取人员的字段(姓名等)。Hibernate尚不知道此人是否有地址,因此不在乎。它将地址集合设置为惰性集合。第一次在此惰性集合上调用方法时,将执行第二个查询以加载人员的所有地址并填充该集合。
对于ManyToOne情况,一个人的字段地址类型为Address。当您加载一个人时,Hibernate应该将此字段初始化为什么。如果将其设置为null并且您要求提供地址,则即使该人有地址,它也将返回null。如果将其设置为惰性地址代理,而您要求提供地址,则即使该人没有地址,它也将返回非空代理,这也是错误的。因此,Hibernate必须知道此人是否有地址。如果没有,则将该字段设置为null。如果有一个,它将地址设置为地址代理。这就是执行附加的左外部联接的原因:知道此人是否有地址(以及该地址的ID是什么,如果有的话)。