svj*_*vjn 4 jpa playframework ebean
在游戏框架中,我使用以下代码从名为“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();
Run Code Online (Sandbox Code Playgroud)
我从“报告”表中获取值列表,但未填充所有相关表值。它们填充有 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;
.
.
}
Run Code Online (Sandbox Code Playgroud)
当我几天前测试时,它加载了这些值,但今天不起作用。当我这样做时rpts.get(i).build.release,它会给出nullPointerException,因为构建在这里为空。该代码最近几天没有更改。想知道为什么会发生这种情况。有人可以建议我是否有任何其他设置文件(如 application.conf)可以执行此延迟加载。请帮忙。
我已经解决了。
问题是我使用以下代码创建了一个 Ebean 事务,导致了问题。
Ebean.beginTransaction();
try{
group.role = "A";
Ebean.update(group);
Ebean.commitTransaction();
} finally {
Ebean.endTransaction();
}
Run Code Online (Sandbox Code Playgroud)
我从未怀疑过这可能会导致问题,因为我将此代码放入与此页面不相关的另一个类文件中。然后我更改为以下代码,一切都按预期工作。
@Transactional
public void saveGroup(Group group){
group.role = "A";
Ebean.save(group);
.
.
}
Run Code Online (Sandbox Code Playgroud)
Play 框架网站中的以下文档帮助我找到了罪魁祸首。:)
直接 Ebean 字段访问的增强(启用延迟加载)仅适用于 Java 类,不适用于 Scala。因此,从 Scala 源文件(包括标准 Play 2 模板)直接进行字段访问不会调用延迟加载,这通常会导致实体字段为空(未填充)。为了确保填充字段,(a) 手动创建 getter/setter 并调用它们,或者 (b) 确保在访问字段之前完全填充实体。
| 归档时间: |
|
| 查看次数: |
1738 次 |
| 最近记录: |