Java 在hibernate中惰性加载child时使用print语句
我有一个Customer and Phone类,与lazy的一对多关联设置为true 我使用Java 在hibernate中惰性加载child时使用print语句,java,hibernate,Java,Hibernate,我有一个Customer and Phone类,与lazy的一对多关联设置为true 我使用 Customer cust = (Customer) session.get(Customer.class, 1); -- (1) cust.getPhoneList(); -- (2) System.out.println(cust.getPhoneList()); -- (3) 在第(1
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语句进行数据库调用?事实上,您对列表执行了一个操作
System.out.println(cust.getPhoneList());
按
System.out.println(cust.getPhoneList().toString());
在内部,
System.out.println(对象x)
调用String.valueOf(x)
,然后witch执行以下操作:
return (obj == null) ? "null" : obj.toString();
最后,您将调用一个操作,toString()
方法
由于您的列表由Hibernate持久化,因此从数据库检索时,它是一个PersistentList
。这里是PersistentList
对toString()
方法的实现:
public String toString() {
read();
return list.toString();
}
您可以看到第一个调用是read()
,它是强制列表初始化的方法
显然,要进行初始化,必须到数据库检索所有数据。这触发了数据库调用。因为println()方法调用toString()方法,并且为了调用toString()方法,必须从数据库()中检索对象,这并没有回答问题。他仍然可以问:“为什么
toString()
方法进行数据库调用?”。看看我的答案。