如何确定hibernate是否已经“懒惰”加载了代理或真实对象?

时间:2011-03-18 10:09:45

标签: hibernate lazy-evaluation

这里是hibernate的新手。我正在使用Hibernate 3.5,我理解应该默认使用延迟抓取。我通过

启用了SQL日志记录
<property name="show_sql">true</property>

我正在请求对象A,该对象具有对象B的引用,该对象B保存实际的数据字节数组。我将数据推送到对象B,以便除非确实需要,否则数据不会从数据库中获取,但是当我请求对象A时,堆会急剧跳转,就像它无论如何都是获取数据一样,我从hibernate获取此输出SQL日志记录:

Hibernate: select attachment0_.id as id11_0_, attachment0_.data as data11_0_ from attachment_data attachment0_ where attachment0_.id=?

我不清楚如何解释这个,特别是'as'语句。 'attachment0.data'似乎是对象B中的字节数组.Hibernate是说它是为数组创建了一个代理,还是说这实际上是从数据库中提取数据?如果它只是创建了一个代理,我会看到没有代理的选择输出吗?

总而言之,我如何确定我是否有代理或真实对象的主要问题,以及如何解释select语句的相关问题?

我已经深入了解了hibernate文档,并且在网上搜索了很多,但是大部分信息似乎都比我缺少的基本知识高出一步,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

您拥有的对象可以是加载了所有数据的代理。如果你想要解析对象,请在Hibernate中使用以下内容:

org.hibernate.impl.SessionImpl您可以获得org.hibernate.engine.PersistenceContext然后

SessionImpl session = ...;
PersistenceContext persistenceContext = session.getPersistenceContext();
Object entity = persistenceContext.unproxy(maybeProxy);

unproxy的javadoc

/**
 * Get the entity instance underlying the given proxy, throwing
 * an exception if the proxy is uninitialized. If the given object
 * is not a proxy, simply return the argument.
 */
public Object unproxy(Object maybeProxy) throws HibernateException;