0

假设我有一个模型 M1.java 包含
@BelongsTo(foreignKeyName = "m2_id", parent = M2.class)
,然后在加载 M1 之后我这样做
M2 myM2 = myM1.parent(M2.class)
我想进行一个额外的查询来获取 M2 对象(类似于 Hibernate FetchType.LAZY),我们如何在第一个查询上强制加入(加载 M1 对象)?

在不可能的情况下,或者在某些情况下我不想加入,是否会每次调用parent(M2.class)重新运行查询以加载 M2,还是会在第一次“获取”后缓存在 M1 对象中?

谢谢。

编辑:
我发现这个页面http://javalite.io/lazy_and_eagerinclude()解释说除非我使用该方法,否则不会缓存父级。
问题是当我使用它时,我在日志中看到使用一个查询来选择父母的查询,但我仍然看到额外的查询再次将它们一一加载!所以不是 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]

到底是怎么回事?

4

1 回答 1

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

如您所见,该框架按预期工作。您可以克隆源并在您的环境中运行以验证这一点。

你的环境一定有问题吗?

于 2015-11-26T05:58:35.803 回答