如何在play框架中避免延迟加载

时间:2014-03-28 10:44:36

标签: jpa playframework ebean

在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)执行此延迟加载。请帮忙。

1 个答案:

答案 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)确保实体   在访问字段之前完全填充。