2011-03-18 19 views
5

Nuevo para hibernar aquí. Estoy usando Hibernate 3.5, que entiendo debería usar la recuperación lenta de forma predeterminada. He habilitado el registro de SQL a través de¿cómo puedo determinar si hibernate ha 'cargado' el proxy o el objeto real?

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

estoy solicitando objeto A que tiene una referencia al objeto B, que sostiene la matriz de bytes de los datos reales. Introduje los datos en el objeto B para que no se obtengan los datos del DB a menos que realmente los necesite, pero cuando solicito el objeto A, el montón salta drásticamente, como si de todos modos se obtuviera la información, y obtengo esta salida de la hibernación el registro de SQL:

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

estoy claro sobre cómo interpretar esto, en concreto el 'como' declaración. El 'attachment0.data' parece ser la matriz de bytes en el objeto B. ¿Hibernate dice que se ha creado un proxy para la matriz, o es esto decir que en realidad se extrajeron los datos de la base de datos? Si se acaba de crear un proxy, ¿no vería ninguna salida de selección para el proxy?

Así que, en resumen, ¿la pregunta principal de cómo puedo determinar si tengo un proxy u objeto real, y la pregunta relacionada de cómo interpretar la instrucción select?

He buceado en los documentos de hibernación, así como en la web un poco, pero la mayoría de la información parece estar un paso por encima del conocimiento básico que me falta, por lo que cualquier ayuda es apreciada.

+0

attachment_data es la mesa asignada a objeto A u objeto B? –

Respuesta

3

El objeto que tiene puede ser un proxy con todos los datos cargados. Si tu quieres unproxy el objeto utilice la siguiente en Hibernate:

Desde un org.hibernate.impl.SessionImpl se puede obtener el org.hibernate.engine.PersistenceContext y luego

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

el Javadoc para 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

gracias por la respuesta. Usted dice que el objeto puede ser un proxy con todos los datos cargados, pero ¿cuál sería el punto en eso? el objeto es realmente solo un contenedor que contiene datos y métodos, entonces, ¿cuál es la diferencia entre un proxy y un objeto real, en el contexto de hibernación que pasa proxies frente a objetos reales? – spiffly

+0

Permítanme aclarar lo que quiero decir: primero se obtiene una instancia de proxy que se inicializa bajo demanda ya sea mediante 'Session.load' (dado que los datos no están en el primer nivel de caché) o al explorar una relación. Luego, cuando se accede a una propiedad del proxy, los datos de la entidad se obtienen de la base de datos. La instancia del objeto java sigue siendo un proxy (con todos los datos cargados) y continuará siendo un proxy hasta que 'desproxy'. Para la hibernación, puede usar un proxy o un objeto real con indiferencia. – Nr9

+0

interesante, gracias. Siempre y cuando los datos y métodos sean los mismos, supongo que realmente no importa si estoy tratando con un proxy o el objeto real en ese momento. – spiffly

Cuestiones relacionadas