2015-11-26 60 views
0

比方說,我有一個包含
@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] 

這是怎麼回事?

+0

順便說一句,如果你的外鍵名是'm2_id',那麼你不需要註釋 – ipolevoy

+0

所以沒有JOIN可能的權利? –

+0

這不是我說的。由於您的外鍵名稱遵循ActiveJDBC命名約定,因此您的註釋是多餘的。 – ipolevoy

回答

0

我無法複製您的體驗。以下是與您的代碼相同的測試:https://github.com/javalite/activejdbc/blob/master/activejdbc/src/test/java/org/javalite/activejdbc/IncludesTest.java#L32

第38行檢查兩個引用是否指向相同的確切對象。此外,測試打印這樣的:

[main] INFO org.javalite.activejdbc.LazyList - Query: "SELECT * FROM addresses WHERE city = ? ORDER BY id", with parameters: <Springfield>, took: 11 milliseconds 
[main] INFO org.javalite.activejdbc.LazyList - Query: "SELECT * FROM users WHERE id IN (?, ?)", with parameters: <1>, <2>, took: 9 milliseconds 

正如你所看到的,框架按預期工作。您可以克隆源代碼並在您的環境中運行以驗證這一點。

你的環境有什麼不對嗎?

+0

你認爲在我的環境中可能是「錯誤的」每次我調用.parent()方法時,都會讓ActiveJDBC運行一個查詢? –

+0

我不知道。如果你可以在一個小程序中重新創建這個問題,然後發佈這個問題:https://github.com/javalite/activejdbc/issues,我可以研究它。 – ipolevoy