2012-09-21 65 views
4

如何使用实体管理器获得懒惰字段? 这里是我的代码片段如何获得休眠状态下的懒惰字段

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. 
} 

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

这两个类在不同的包中。所以我无法直接访问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(); 

这就是我如何用我的代码,但我看不出任何区别。

+0

感谢SiB,我看到了,但我没有更多关注。 – Pesula

+0

我注释这个字段就像在我的Internet类浏览器中一样是Lazy。当我检查**互联网object.Browser对象的值。名**,我得到正确的价值,但是当我得到与** getters **相同​​的对象的价值,我得到另一个值。对于懒惰或我对概念的理解很差,这有什么关系吗? – Pesula

回答

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因为你不希望每次加载Internet时间来加载Browser

+0

你是对的。我不想每次都加载浏览器对象。但我有一个问题,我在一个页面(一个类)中获取Internet对象,并将该对象传递给其他类。我正在使用这个Internet对象。实际上我使用Aribaweb来选择浏览器(名称)的预期对象的一个​​属性,当我指定Internet对象。浏览器object.getName()(这是期待对象在这里),它的意思表达。我该如何选择 – Pesula

+1

你应该在事务处理程序从数据库加载'internet'对象的地方调用'internet.getBrowser()',否则唯一的解决方案就是指定'FetchType.EAGER'。 – SiB

+0

我的审阅者根本不会接受指定FetchType.EAGER。 – Pesula

0

假设你在em变量中使用了EntityManager实例,并且使用id的Internet对象的ID,我假设你在第一页上的某个时刻调用如下所示:

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

的代码相同的方法非常下一行做到这一点:

internet.getBrowser(); 

你不必做的结果什么,你只需要调用该方法在同一事务上下文作为寻找电话。触发该属性将导致EntityManager加载该字段。然后你可以传递你的互联网对象,并期望brow属性是非空的。

+0

我以为我应该工作,但它没有可以检查我的最新帖子。 – Pesula