比方說,我有一個包含
@BelongsTo(foreignKeyName = "m2_id", parent = M2.class)
模型M1.java再裝填M1後,我做
M2 myM2 = myM1.parent(M2.class)
我想一個額外的查詢,以便抓取M2對象(類似於休眠FetchType.LAZY) ,我們如何強制加載第一個查詢(加載M1對象)?ActiveJDBC @BelongsTo JOIN?緩存?
如果不可能,或者我不想在某些情況下加入,每次調用parent(M2.class)
都會重新運行查詢以加載M2,或者在第一次「取」?
謝謝。
編輯:
我找到了這個網頁http://javalite.io/lazy_and_eager解釋,除非我用了include()
方法母公司將不會被緩存。
問題是當我使用它時,我在日誌中看到查詢來選擇具有一個查詢的父母,但我仍然看到額外的查詢來再次加載它們!所以它不是O(2)而不是O(n + 1),而是O(n + 2)!
...
// Both test tables contain 1 row
List<M1> myM1s = M1.where(query, params).include(M2.class);
...
// Duplicating 3 times the print statement for test purpose
System.out.println(myM1s.get(0).parent(M2.class));
System.out.println(myM1s.get(0).parent(M2.class));
System.out.println(myM1s.get(0).parent(M2.class));
...
日誌
Query: "SELECT * FROM m1 WHERE...", with parameters:...
Query: "SELECT * FROM m2 WHERE id IN (1)"
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
Query: "SELECT * FROM m2 WHERE id = ?", with parameters: <1>
[print statement]
這是怎麼回事?
順便說一句,如果你的外鍵名是'm2_id',那麼你不需要註釋 – ipolevoy
所以沒有JOIN可能的權利? –
這不是我說的。由於您的外鍵名稱遵循ActiveJDBC命名約定,因此您的註釋是多餘的。 – ipolevoy