不可靠的Hibernate对象

时间:2009-07-16 14:56:40

标签: java hibernate lazy-loading

我遇到了从查询传回来的Hibernate对象不可靠的情况。

请考虑以下代码:

MyClass myClass = myDAO.get(id);

myClass.getId(); //This works
myClass.getName(); //This returns null sometimes, and works sometimes

这是我的获取方法:

@SuppressWarnings("unchecked")
public T get(ID id) 
{
    Session s = getSession();
    T entity = (T) s.load(getPersistentClass(), id);
    s.disconnect();
    return entity;
}

现在,我知道这个对象是一个代理,并且会被延迟加载,但我希望它总是可以工作,或者永远不会工作。我在这里做错了吗?

2 个答案:

答案 0 :(得分:3)

这可能是原因,也可能不是原因,但您可能不应该使用Session.load(),您应该使用Session.get()

load()返回当前由hibernate加载的持久化实例,并且可能会根据之前发生的事情部分填充。

get()更强大。试试吧。

答案 1 :(得分:1)

问题是“load”会加载对象的代理而不会实际命中数据库。但是,如果对象已经加载(并填充),即在1级缓存中,它将提供该实例。

当你使用load时,它只会在绝对必要时才会实际命中数据库,即当你要求对象的一个​​字段时。

另一方面,实际上会打到数据库。

出于您的目的,我建议您使用加载还是确保在传回对象之前填充该对象。在你传回之前,请打电话给其中一个吸气剂。然后你可以保证它已被填充。

一个有用的练习是启用sql logging(org.hibernate.SQL = DEBUG),通过它调试并查看正在执行的sql指令。

您还可以考虑将正在加载的持久对象配置为非惰性。这样,无论你使用load还是get,你都会每次都得到一个完全填充的对象。