我正在使用带有 Java 的 play 2.0.4。我正在尝试从 play 提供的内存数据库中保存和检索一个值(Ebean 是底层 JPA 实现)。这是一些示例代码:
@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 中,@(users: List[User], userForm: Form[User])
<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 调试,并且我已经验证了 Role 表的外键保存在 User 表中。当我在 User.all() 方法(参见 SOP2)中打印角色名称时,会触发一个查询并打印角色名称。它也显示在视图上。
我知道,默认情况下,角色将被延迟加载,并且模板中无法使用 PersistenceContext 来加载与用户关联的角色。但是,不应该急切地获取对象的所有相关实体吗?我对 Play 和 JPA 还很陌生,当我加载某些东西时,我不知道如何在不通过每个关联实体的情况下让它工作。有什么我想念的吗?
在相关的说明中,如果我必须使用延迟获取,我如何确保在获取用户时 user.role 对视图可用?