我遇到了从查询传回来的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;
}
现在,我知道这个对象是一个代理,并且会被延迟加载,但我希望它总是可以工作,或者永远不会工作。我在这里做错了吗?
答案 0 :(得分:3)
这可能是原因,也可能不是原因,但您可能不应该使用Session.load()
,您应该使用Session.get()
。
load()
返回当前由hibernate加载的持久化实例,并且可能会根据之前发生的事情部分填充。
get()
更强大。试试吧。
答案 1 :(得分:1)
问题是“load”会加载对象的代理而不会实际命中数据库。但是,如果对象已经加载(并填充),即在1级缓存中,它将提供该实例。
当你使用load时,它只会在绝对必要时才会实际命中数据库,即当你要求对象的一个字段时。
另一方面,实际上会打到数据库。
出于您的目的,我建议您使用加载还是确保在传回对象之前填充该对象。在你传回之前,请打电话给其中一个吸气剂。然后你可以保证它已被填充。
一个有用的练习是启用sql logging(org.hibernate.SQL = DEBUG),通过它调试并查看正在执行的sql指令。
您还可以考虑将正在加载的持久对象配置为非惰性。这样,无论你使用load还是get,你都会每次都得到一个完全填充的对象。