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)