在Play框架中,我使用以下代码从名为" Report"的表中获取值。其他关系表如" Project"," Build"等。
List<Report> rpts = Report.find.where()
.eq("publish","1")
.eq("functionality_id", Integer.toString(fun.id))
.eq("project_id", currentProject.id)
.eq("prod_build", prod_build)
.eq("loadType_id", loadType_id)
.in("build_id", buildId)
.orderBy("id desc")
.findList();
我从&#34;报告&#34;获取值列表表,但不填充所有相关的表值。它们填充为null。
@Entity
@Table(name="report")
public class Report {
@Id
public int id;
@Constraints.Required
@ManyToOne
@JoinColumn(name="build_id")
public Build build;
@Constraints.Required
@ManyToOne
@JoinColumn(name="project_id")
public Project project;
.
.
}
当我几天前测试时,它已经加载了这些值,但今天没有工作。当我执行rpts.get(i).build.release
时,它会nullPointerException
,因为此处的构建为空。这段代码最近几天没有改变。想知道为什么会这样。有人可以告诉我是否有任何其他设置文件(如application.conf)执行此延迟加载。请帮忙。
答案 0 :(得分:4)
我已经解决了。
问题是我使用以下代码创建了一个Ebean事务,这导致了麻烦。
Ebean.beginTransaction();
try{
group.role = "A";
Ebean.update(group);
Ebean.commitTransaction();
} finally {
Ebean.endTransaction();
}
我从未怀疑这可能会导致问题,因为我将此代码放在与此页面无关的另一个类文件中。然后我改为以下代码,一切都按预期工作。
@Transactional
public void saveGroup(Group group){
group.role = "A";
Ebean.save(group);
.
.
}
play framework site中的以下文档帮助我确定了罪魁祸首。 :)
增强直接Ebean字段访问(启用延迟加载)是 仅适用于Java类,而不适用于Scala。因此,直接现场访问 来自Scala源文件(包括标准Play 2模板)没有 调用延迟加载,通常导致空(未填充)实体 领域。要确保填充字段,可以(a)手动创建 getter / setters并改为调用它们,或(b)确保实体 在访问字段之前完全填充。