Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate中惰性加载child时使用print语句_Java_Hibernate - Fatal编程技术网

Java 在hibernate中惰性加载child时使用print语句

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 and Phone类,与lazy的一对多关联设置为true

我使用

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()
方法进行数据库调用?”。看看我的答案。