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

spi*_*fly 5 hibernate lazy-evaluation

这里是休眠的新手.我正在使用Hibernate 3.5,我理解应该默认使用延迟抓取.我通过启用SQL日志记录

<property name="show_sql">true</property>
Run Code Online (Sandbox Code Playgroud)

我正在请求对象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=?
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 3

您拥有的对象可以是加载所有数据的代理。如果您想取消代理该对象,请在 Hibernate 中使用以下命令:

从 aorg.hibernate.impl.SessionImpl你可以得到org.hibernate.engine.PersistenceContext然后

SessionImpl session = ...;
PersistenceContext persistenceContext = session.getPersistenceContext();
Object entity = persistenceContext.unproxy(maybeProxy);
Run Code Online (Sandbox Code Playgroud)

取消代理的 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;
Run Code Online (Sandbox Code Playgroud)