我有一个Customer和Phone类,其中一对多与lazy设置为true。
我使用
加载ID为'101'的Customer对象Customer cust = (Customer) session.get(Customer.class, 1); -- (1)
cust.getPhoneList(); -- (2)
System.out.println(cust.getPhoneList()); -- (3)
在第(1)点,我没有手机列表,因为它们是懒惰的。
在第(2)点,我没有电话列表,也没有进行数据库通话。
在点(3)或点(2)被点(3)替换时,进行数据库调用,返回电话号码列表。我一直认为只有当我做一些数据库调用才能返回电话号码用列表操作。例如,cust.getPhoneList().size()
或迭代它。
我没理解为什么使用print语句拨打数据库?
答案 0 :(得分:1)
事实上,您执行列表中的操作。
System.out.println(cust.getPhoneList());
以
完成 System.out.println(cust.getPhoneList().toString());
答案 1 :(得分:0)
在内部,System.out.println(Object x)
调用String.valueOf(x)
,然后执行:
return (obj == null) ? "null" : obj.toString();
最后,您正在调用一个操作toString()
方法。
由于您的列表是由Hibernate持久化的,因此从数据库中检索时它是PersistentList
。在这里,PersistentList
实现了toString()
方法:
public String toString() {
read();
return list.toString();
}
您看到第一个调用是read()
,女巫是强制列表初始化的方法。
显然,要进行初始化,您必须转到数据库检索所有数据。这触发了数据库调用。