【问题标题】:How to avoid lazy loading in play framework如何避免播放框架中的延迟加载
【发布时间】:2014-03-28 10:44:36
【问题描述】:

在 play framework 中,我使用以下代码从名为“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();

我从“报告”表中获取值列表,但未填充所有相关表值。它们用 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 因为 build 在这里是空的。最近几天没有更改此代码。想知道为什么会这样。有人可以建议我是否有任何其他设置文件(如 application.conf)可以执行此延迟加载。请帮忙。

【问题讨论】:

    标签: jpa playframework ebean


    【解决方案1】:

    我已经解决了。

    问题是我使用以下导致问题的代码创建了一个 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/setter 并改为调用它们,或者 (b) 确保实体是 在访问字段之前已完全填充。

    【讨论】:

    • 指定 FetchType 来强制加载怎么样?像这样:@OneToMany(fetch = FetchType.LAZY)
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多