这里是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文档,并且在网上搜索了很多,但是大部分信息似乎都比我缺少的基本知识高出一步,所以任何帮助都会受到赞赏。
答案 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;