2

我遇到了从查询传回的 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;
}

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

4

2 回答 2

3

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

load()返回当前由 hibernate 加载的持久实例,根据之前发生的情况,这可能是部分填充的。

get()更健壮。试试看。

于 2009-07-16T15:00:22.700 回答
1

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

当您使用加载时,它只会在绝对必要时才会真正访问数据库,即当您请求对象的字段之一时。

另一方面,获取实际上会命中数据库。

出于您的目的,我建议您无论是使用 load 还是让您确保在将对象传回之前已填充该对象。在你把它传回去之前,调用它的一个吸气剂。然后你可以保证它被填充。

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

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

于 2009-07-16T17:16:06.967 回答