如何使用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();
这就是我使用我的代码的方式,但我看不出任何差异。
答案 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加载该字段。然后你可以传递你的互联网对象,并期望眉毛属性为非空。