我正在使用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