0

怠惰なものがtrueに設定された1対多の関連付けを持つCustomerandPhoneクラスがあります。

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ステートメントを使用してデータベースを呼び出す理由がわかりませんでしたか?

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 に答える