我怎样才能在Hibernate中获得一个Lazy字段

时间:2012-09-21 15:55:31

标签: hibernate jpa

如何使用Entity Manager获取Lazy字段? 这是我的代码片段

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

这是我的浏览器Hibernate类;

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的find方法使用Internet.id获取浏览器实例时,我想要浏览器的名称。

这两个类在不同的包中。所以我无法直接访问browser.name。 我想要浏览器的名称。当我调试我的程序browser.name得到null。有没有办法使用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();

这就是我使用我的代码的方式,但我看不出任何差异。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

internet.getBrowser();

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