为何Hibernate中isPropertyInitialized返回true而isInitialized返回false?
Hibernate懒加载集合:isInitialized与isPropertyInitialized结果差异
你的这个问题其实是没搞懂Hibernate这两个方法的核心区别,咱们拆解来看:
两个方法的本质差异
Hibernate.isInitialized(autos):这个方法的作用是检查集合本身是否已经完成数据加载。因为你给autos设置了FetchType.LAZY,在你没有主动调用getAutos()遍历、或者触发加载之前,它只是一个Hibernate生成的懒加载代理集合(比如PersistentBag),并没有真正从数据库拉取关联的Auto数据,所以这个方法返回false。Hibernate.isPropertyInitialized(personObject, "autos"):这个方法是检查实体的该属性是否已经被赋值(而非null)。当Hibernate加载Person对象时,会自动给懒加载的集合属性创建一个空的代理对象(不会让属性为null),所以站在属性是否被初始化(即是否有值)的角度,这个属性已经被设置了代理对象,因此返回true。
结合你的代码场景验证
你执行personRepository.findAll().get(0)获取Person对象后:
- autos属性得到的是一个未触发加载的代理集合,所以
isInitialized(autos)检测不到实际的数据加载,返回false; - 但这个autos属性已经被Hibernate赋值了代理对象,不是null,所以
isPropertyInitialized判定属性已初始化,返回true。
内容的提问来源于stack exchange,提问作者beatrice
相关产品推荐
相关产品推荐

