2011-03-18 41 views
5

這裏新來休眠。我使用的是Hibernate 3.5,我知道默認情況下應該使用延遲獲取。我已經通過我如何確定hibernate是否有'lazy'加載代理或真實對象?

<property name="show_sql">true</property> 

啓用SQL日誌記錄我請求,其具有參考對象B保持數據的實際字節數組對象A。我將數據推送到對象B中,這樣除非真正需要數據,否則數據不會從數據庫中獲取,但是當我請求對象A時,堆會急劇跳轉,就好像無論如何它都獲取數據,並且我從休眠中獲取此輸出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

attachment_data的org.hibernate.engine.PersistenceContext,然後

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

的Javadoc映射表對象A或對象B? – 2011-03-18 10:14:50

回答

3

您擁有的對象可以是加載了所有數據的代理。如果您想unproxy對象使用休眠的情況如下:

org.hibernate.impl.SessionImpl你可以得到unproxy

/** 
* 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; 
+0

感謝您的回覆。你說對象可以是加載所有數據的代理,但是其中的重點是什麼?該對象實際上只是一個容納數據和方法的容器,那麼在hibernate傳遞代理和真實對象的上下文中,代理和實際對象之間有什麼區別? – spiffly 2011-03-21 17:57:26

+0

讓我澄清一下我的意思:首先得到一個通過'Session.load'按需初始化的代理實例(假定數據不在第一級緩存中)或瀏覽關係。然後,當代理的屬性被訪問時,實體數據從數據庫中獲取。 java對象實例仍然是一個代理(加載所有數據),它將繼續作爲代理,直到你「解除代理」爲止。對於休眠,您可以無差別地使用代理或實際對象。 – Nr9 2011-03-21 19:29:45

+0

有趣,謝謝。只要數據和方法是相同的,我想我是在處理代理還是真正的對象並不重要。 – spiffly 2011-03-25 09:28:31

相關問題