背景:数据库访问使用JPA + Spring-Data-Jpa + Hibernete实现。
现有实体类A,其中含字段B,B是另一个实体类对象。
在B字段上加注解@ManyToOne(fetch = FetchType.LAZY)
表明:
A与B是多对一的关系,且查询A对象时对B对象执行懒加载模式,也就是说不会去查询B类对应的表。查出来的A类中的B是一个代理对象,只包含id字段。
只有在真正使用B对象的时候才会去查询B类对应的表,获取B类的全部属性。
请注意,这里的真正使用并不是指get方法,而是指需要访问其他属性。例如引用类型对象相等比较时,会调用equals方法,如果在该方法中访问了其他属性,就会触发代理对象的实际查询。
另外,debug模式和非debug模式有所不同。使用Idea的Debug模式,控制台的Variables
里面会输出当前的局部变量,如果局部变量是引用类型,则会调用toString方法来输出。
如果当前的局部变量刚好是懒加载的代理对象,而toString
方法是自定义方法,里面访问了除id之外的其他属性,也会触发代理对象的实际查询。