0

我有一个 Customer 和 Phone 类,其中一对多关联,lazy 设置为 true。

我使用id 加载 Customer 对象为“101”

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 语句进行数据库调用?

4

2 回答 2

1

实际上,您对列表进行了操作。

 System.out.println(cust.getPhoneList());

做为

 System.out.println(cust.getPhoneList().toString());
于 2012-09-19T12:21:16.587 回答
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(),witch 是强制列表初始化的方法。

显然,要进行初始化,您必须到数据库中检索所有数据。这触发了数据库调用。

于 2012-09-19T12:23:43.753 回答