4

如何使用实体管理器获取惰性字段?这是我的代码片段

public class Internet implements Serializable{
      int id;
      // related fields 
      @ManyToOne (fetch=FetchType.LAZY)
      Browsers brow;
      //related public getters and setters.
 }

这是我的浏览器休眠类;

public class Browser implements Serializable{

  int id;
  String name;
  //and some other useful fields. 

  //here public getters and setters.
  public String getName(){
     return name; 
  }

  public void setName(String name){
     this.name = name
  }
  //and few more.
}

现在我的要求是,当我使用 EntityManger 的使用 Internet.id 的查找方法获取浏览器实例时,我想要浏览器的名称。

这两个类在不同的包中。所以我无法直接访问 browser.name。我想要浏览器的名称。当我调试我的程序 browser.name 为空。有什么方法可以使用 EntityManager 获取 browser.name 的值。

我读了几篇与这个问题相关的帖子,但我没有得到任何线索。任何机构都可以帮助我。

这是我的代码如何使用我的页面和几件事:

InternateObjectUsingPage usingPage = (InternateObjectUsingPage)pageWithName(InternateObjectUsingPage.class.getName());
    _em = EntityManager.createEntityManager();
    Internet ipReg = _em.find(Internet.class, _currentRow.getIpRegId()) ; // _currentRow.getInRegId() is id. 
    ipReg.getBrowser(); // recently i added as per the suggestion.
    if(ipReg != null){
        _refresh = true;
        usingPage.setInternet(ipReg);
        return usingPage;
    }
    _em.close();

这就是我使用我的代码的方式,但我看不出有任何区别。

4

2 回答 2

0

假设你在 em 变量中有你正在使用的 EntityManager 实例,以及要在 id 中使用的 Internet 对象的 id,我假设在你的第一页上的某个时刻你正在调用 find,如下所示:

Internet internet = em.find(Internet.class, id);

同一方法的下一行代码中执行以下操作:

internet.getBrowser();

您不必对结果执行任何操作,只需在与 .find 调用相同的事务上下文中调用该方法。触发该属性将导致 EntityManager 加载该字段。然后,您可以在任何地方传递您的互联网对象,并期望 brow 属性为非空。

于 2012-09-21T17:38:32.093 回答
0

您可以在查询Internet对象的方法中尝试此操作;调用internet.getBrowser()以在该点本身加载它。

Internet internet = 
  (Internet) query.getSingleResult(); // or the way you fetch via EM
internet.getBrowser();

或者如果您查询对象列表:

List<Internet> internetList = 
  (List<Internet>) query.getSingleResult();  // or the way you fetch via EM
for(Internet internet: internetList){     
    internet.getBrowser();
}

我假设您已经指定FetchType.EAGER,因为您不想在Browser每次加载时都加载Internet

于 2012-09-21T16:10:28.527 回答