我正在使用play 2.0.4與Java。我試圖保存並從內存數據庫檢索值提供(Ebean是底層的JPA實現)。 下面是一些示例代碼:Eager fetch似乎並沒有加入
@NoobDisclaimer ("I'm fairly new to Play and JPA")
@Entity
public class User extends Model {
@Id
public Long id;
public String name;
// Does not fetch eagerly.
@ManyToOne(fetch=FetchType.EAGER)
private Role role; // Role extends Model { has id and name}
public static Finder<Long, User> find = new Finder<Long, User>(Long.class, User.class);
public static List<User> all() {
List<User> allUsers = find.all();
for (User u : allUsers) {
System.out.println("User:" + u.id + "|" + u.name); // SOP1
// System.out.println("Assoc Role:" + u.role.name); //SOP2
}
return allUsers;
}
public static void create(User user) {
user.save();
}
}
在index.scala.html, @(用戶:列表[用戶],用戶窗體:表格[用戶])
<h2>@users.size() user(s) found!</h2>
<ul>
@for(usr <- users) {
<li>Name: @usr.name</li> <!-- Displayed -->
<li>Role: @usr.role.name</li> <!-- Displays blank value -->
}
</ul>
的問題是,當我在控制器中執行User.all()並將其發送到視圖時,user.role未加載,即@ usr.role.name爲空。沒有例外。我已經設置了SQL調試,並且已驗證角色表的外鍵保存在用戶表中。當我在User.all()方法中打印角色名稱(請參閱SOP2)時,會觸發查詢並打印角色名稱。它也顯示在視圖上。
我明白,默認情況下,該角色將被延遲加載,並且PersistenceContext在模板中不可用以加載與用戶關聯的角色。但是,不應該急於獲取所有對象的相關實體嗎?我對 Play和JPA相當陌生,我無法弄清楚如何在加載某些內容時無需通過每個關聯實體就能使其工作。有什麼我失蹤?
在相關說明中,如果必須使用懶惰獲取,我如何確保在獲取用戶時user.role可用於視圖?
我看了[鏈接] http://stackoverflow.com/questions/463349/jpa-eager-fetch-does-not-join但我沒有使用Hibernate(所以@Fetch不可用) 。 – Rajiv
我不明白你爲什麼在這裏使用雙「@」'@@ ManyToOne' –
對不起。這是一個錯字。我糾正了它。 – Rajiv