как определить, загрузил ли hibernate прокси или реальный объект? - PullRequest
5 голосов
/ 18 марта 2011

Впервые в спящий режим здесь.Я использую Hibernate 3.5, который, как я понимаю, должен использовать ленивую выборку по умолчанию.У меня включено ведение журнала SQL через

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

Я запрашиваю объект A, который имеет ссылку на объект B, который содержит фактический байтовый массив данных.Я поместил данные в объект B, чтобы данные не извлекались из БД, если они действительно не нужны, но когда я запрашиваю объект A, куча резко скачет, как будто все равно получает данные, и я получаю этот вывод из спящего режимаВедение журнала SQL:

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

Мне неясно, как это интерпретировать, в частности утверждение «как».«Attachment0.data», кажется, является байтовым массивом в объекте B. Является ли hibernate сообщением о том, что он создал прокси для массива, или это говорит о том, что он фактически извлек данные из БД?Если бы он только что создал прокси-сервер, я бы не увидел выходных данных выбора для прокси-сервера?

Итак, вкратце, основной вопрос, как я могу определить, есть ли у меня прокси или реальный объект, и связанный с этим вопрос оинтерпретировать оператор select?

Я погрузился в документы гибернации, а также немного поискал в Интернете, но большая часть информации, кажется, на шаг выше базовых знаний, которые мне не хватает,поэтому любая помощь приветствуется.

1 Ответ

3 голосов
/ 18 марта 2011

Объект, который у вас есть, может быть прокси со всеми загруженными данными.Если вы хотите снять с прокси объект, используйте в Hibernate следующее:

Из org.hibernate.impl.SessionImpl вы можете получить org.hibernate.engine.PersistenceContext и затем

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

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;
...