2014-03-28 51 views
3

在遊戲框架,我用下面的代碼從一個名爲「報告」表,該表有其他關係的表像「項目」獲取價值「構建」等如何避免在遊戲框架延遲加載

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爲null。此代碼在最近幾天沒有更改過。想知道爲什麼會發生這種情況。有人可以建議我是否有任何其他設置文件(如application.conf)執行此延遲加載。請幫忙。

回答

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)確保實體在訪問字段之前已完全填充 。

+1

如何指定FetchType來強制加載? 像這樣:@OneToMany(fetch = FetchType.LAZY) –